代码改变世界

希尔排序

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 }
View Code