插入排序之希尔排序(缩小增量排序)Java代码
概念:希尔排序简单的来说就是将要排序的序列通过取其步长把整个要排序的序列按照步长分成几个组,最后再这几个组内部进行直接插入排序。
步长的取法:排序序列长度除以2并向下取整后面,直到步长的长度为1就不需要在取步长。不懂看后面的实列
基本思想:第一步:通过步长计算方法将要排序的序列按步长分组
第二步:在分组后的序列中进行组内的直接插入排序
第四步:重复第一步和第二步,直到步长为一时,进行最后的一次组内的直接插入排序,其排序结果就是原序列的希尔排序的果。
实列:
将要排序的序列是:3 6 5 2 5 1 4
那么第一步长就是:d1 = 7/2 =3(向下取整) 可以将该序列分成3组
那么第一组的数就应该是:3 2 4 再进行一次直接插入排序那么现在的序列变成了 2 3 4 这一组就完成了希尔排序了
接着第二组的数就应该是:6 5 再进行一次直接插入排序那么现在的序列变成了 5 6 这一组就完成了希尔排序了
最后一组的数就应该是: 5 1 再进行一次直接插入排序那么现在的序列变成了 5 1 这一组就完成了希尔排序了
所以经过第一次d=3的步长的希尔排序后的序列变为了:2 5 1 3 6 5 4
那么第二步长就是:d2 = d1/2=3/2 =1 (向下取整) 所以只能分为一组
其系列为 2 5 1 3 6 5 4 ,在进行直接插入排序就完成了对原序列的希尔排序了,结果为:1 2 3 4 5 5 6
Java代码:
public static void shellInsort(int[] arr) {
int step,i,j;
int temp = 0;
for (step=arr.length/2;step>=1;step=step/2){ //第一for是用来控制步长的 取法n/2
System.out.println("step: " + step); //查看计算的步长
for (i=step;i<arr.length;i++){ //对每一组的数进行直接插入排序(同时进行)(i++表示的是每组同时进行直接插入排序)
temp = arr[i];
for (j=i-step;j>=0&&arr[j]>temp;j=j-step){
arr[j+step] = arr[j];
}
arr[j+step] = temp;
}
}
}
public static void main(String[] args) {
int [] arr = {3,6,5,2,5,1,4,10};
shellInsort(arr);
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}