1 基本思想
1)设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。
2)由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
2 基本步骤
我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。
3 动画演示
4 参考代码
package com.tcxpz.shell; /** * 希尔排序 * @author jgp QQ:1072218420 * */ public class ShellSort { public static void main(String []args){ int[] arr = new int[]{8,9,1,7,2,3,5,4,6,0}; System.out.print("排序前:"); for(int num:arr) System.out.print(num+" "); System.out.println(); //进行排序 int[] bubble_arr = sort(arr); System.out.print("排序后:"); for(int num:bubble_arr) System.out.print(num+" "); } //希尔排序 public static int[] sort(int []arr){ //增量gap,并逐步缩小增量 for(int gap=arr.length/2;gap>0;gap/=2){ //从第gap个元素,逐个对其所在组进行直接插入排序操作 for(int i=gap;i<arr.length;i++){ int j = i; while(j-gap>=0 && arr[j]<arr[j-gap]){ //插入排序采用交换法 int temp = arr[j]; arr[j] = arr[j-gap]; arr[j-gap] = temp; j-=gap; } } } return arr; } }