希尔排序
2014-09-19 18:20 微尘_无名 阅读(147) 评论(0) 编辑 收藏 举报希尔排序的关键思想是使序列中任意间隔h的元素都是有序的,其中h是一个递增序列,使得该递增序列(如1/2 (3k-1))递减(从N / 3开始递减到1),当h为1时,整个序列就是有序的了。简易实现及测试用例如下:
1 import java.util.logging.Handler; 2 3 4 public class Shell { 5 6 private static void exch(Comparable[] a, int i , int j){ 7 Comparable tmp = a[i]; 8 a[i] = a[j]; 9 a[j] = tmp; 10 } 11 12 private static boolean less(Comparable a, Comparable b) 13 { 14 return (a.compareTo(b) < 0); 15 } 16 17 private static void show(Comparable[] a) 18 { 19 int N = a.length; 20 for(int i = 0; i < N; i++) 21 { 22 System.out.print(a[i] + " "); 23 } 24 System.out.println(); 25 } 26 27 public static boolean isSorted(Comparable[] a) 28 { 29 int N = a.length; 30 for(int i = 1; i < N; i++) 31 { 32 if(less(a[i], a[i - 1])) return false; 33 } 34 return true; 35 } 36 37 public static void sort(Comparable[] a) 38 { 39 int N = a.length; 40 int h = 1; 41 while(h < N / 3) h = 3 * h + 1; 42 while(h >= 1) 43 { 44 for(int i = h; i < N; i++) 45 { 46 for(int j = i; j >= h && less(a[j], a[j - h]); j -= h) 47 exch(a, j, j - h); 48 } 49 h = h / 3; 50 } 51 } 52 53 public static void main(String[] args) { 54 String[] a = StdIn.readAllStrings(); 55 Selection.sort(a); 56 show(a); 57 } 58 }