1 /**
2 * 03/09/2014
3 * @author Burke
4 *
5 */
6 public class ShellSort {
7
8 public static int[] a = {49,38,65,97,76,13,27,49,55,04};
9
10 public static void main(String[] args) {
11 int i;
12 int index = a.length;
13
14 System.out.print("排序前:");
15 for(i = 0; i < index; i++){
16 System.out.printf("%3s ",a[i]);
17 }
18 System.out.println("");
19
20 shellSort(index);
21
22 System.out.print("排序后:");
23 for(i = 0;i < index; i++)
24 System.out.printf("%3s ",a[i]);
25 System.out.println("");
26 }
27 public static void shellSort(int index){
28 int i, j, k;
29 int temp;
30 boolean change;
31 int dataLength;
32 int pointer;
33 //index为数组长度
34 //dataLength为增量,刚开始为数据长度的一半
35 dataLength = (int) index / 2;
36
37 while(dataLength != 0){
38 //从后往前
39 for( j = dataLength; j < index; j++){
40 change = false;
41 temp = a[j];//开始j=dataLength为每组数据的第二个数
42 pointer = j - dataLength;
43 /*
44 * 下面9行为:对每组数据进行插入排序。按照递增的顺序
45 */
46 //从后往前寻找插入的位置,将数组往后移动
47 while(temp < a[pointer] && pointer >= 0 && pointer <= index){
48 a[pointer + dataLength] = a[pointer];//数组后移
49 pointer = pointer - dataLength;//将比较的指针前移
50 change = true;
51 if (pointer<0 || pointer > index) {
52 break;
53 }
54 }
55 a[pointer + dataLength] = temp;//插入到正确的位置
56
57 if(change){
58 System.out.print("排序中:");
59 for (k = 0; k < index; k++) {
60 System.out.printf("%3s ",a[k]);
61 }
62 System.out.println("");
63 }
64 }
65 dataLength = dataLength / 2;
66 }
67 }
68 }
69 /*
70 * 结果:
71 * 排序前: 49 38 65 97 76 13 27 49 55 4
72 * 排序中: 13 38 65 97 76 49 27 49 55 4
73 * 排序中: 13 27 65 97 76 49 38 49 55 4
74 * 排序中: 13 27 49 97 76 49 38 65 55 4
75 * 排序中: 13 27 49 55 76 49 38 65 97 4
76 * 排序中: 13 27 49 55 4 49 38 65 97 76
77 * 排序中: 4 27 13 55 49 49 38 65 97 76
78 * 排序中: 4 27 13 49 49 55 38 65 97 76
79 * 排序中: 4 27 13 49 38 55 49 65 97 76
80 * 排序中: 4 13 27 49 38 55 49 65 97 76
81 * 排序中: 4 13 27 38 49 55 49 65 97 76
82 * 排序中: 4 13 27 38 49 49 55 65 97 76
83 * 排序中: 4 13 27 38 49 49 55 65 76 97
84 * 排序后: 4 13 27 38 49 49 55 65 76 97
85 */