希尔排序
思想:
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
更多信息:http://baike.baidu.com/view/1110250.htm
代码:
public static void main(String[] args) { int[] i = {1001,596,403,39,23,12,9,6,5,4,3,1}; shellSort(i); } private static void show(int[] x) { for (int i:x) { System.out.print(i + " "); } System.out.println(); } // 希尔排序 public static void shellSort(int[] x) { show(x); int n = 1; // 分组 for (int increment = x.length / 2;increment > 0;increment /= 2) { System.out.println("----------Round " + n++ + "-----------"); // 每个组内排序 for (int i = increment;i < x.length;i++) { int temp = x[i]; int j = 0; for (j = i;j >= increment;j -= increment) { if (temp < x[j - increment]) { x[j] = x[j - increment]; } else { break; } } x[j] = temp; show(x); } } show(x); }
结果:
1001 596 403 39 23 12 9 6 5 4 3 1 ----------Round 1----------- 9 596 403 39 23 12 1001 6 5 4 3 1 9 6 403 39 23 12 1001 596 5 4 3 1 9 6 5 39 23 12 1001 596 403 4 3 1 9 6 5 4 23 12 1001 596 403 39 3 1 9 6 5 4 3 12 1001 596 403 39 23 1 9 6 5 4 3 1 1001 596 403 39 23 12 ----------Round 2----------- 4 6 5 9 3 1 1001 596 403 39 23 12 4 3 5 9 6 1 1001 596 403 39 23 12 4 3 1 9 6 5 1001 596 403 39 23 12 4 3 1 9 6 5 1001 596 403 39 23 12 4 3 1 9 6 5 1001 596 403 39 23 12 4 3 1 9 6 5 1001 596 403 39 23 12 4 3 1 9 6 5 39 596 403 1001 23 12 4 3 1 9 6 5 39 23 403 1001 596 12 4 3 1 9 6 5 39 23 12 1001 596 403 ----------Round 3----------- 3 4 1 9 6 5 39 23 12 1001 596 403 1 3 4 9 6 5 39 23 12 1001 596 403 1 3 4 9 6 5 39 23 12 1001 596 403 1 3 4 6 9 5 39 23 12 1001 596 403 1 3 4 5 6 9 39 23 12 1001 596 403 1 3 4 5 6 9 39 23 12 1001 596 403 1 3 4 5 6 9 23 39 12 1001 596 403 1 3 4 5 6 9 12 23 39 1001 596 403 1 3 4 5 6 9 12 23 39 1001 596 403 1 3 4 5 6 9 12 23 39 596 1001 403 1 3 4 5 6 9 12 23 39 403 596 1001 1 3 4 5 6 9 12 23 39 403 596 1001