希尔排序可以看成是插入排序的优化版,其核心排序步骤与插入排序基本相同,但是唯一不同
的是希尔排序对排序数组中数据排序思想的优化。为什么要优化插入排序,由于插入排序对于
大规模乱序数组的排序是很慢的,因为在插入排序中数据元素需要一点一点的从数组一端移动
到另外一端,这无疑在大规模乱序数组中是一个不好的体验。
希尔排序基本思路:
希尔排序在选取排序数组集采用了分组插入排序的方式,其通过一个gap增量每隔gap量选取一
个数组中元素。对于每一个组中的元素进行插入排序后缩小gap增量,如此往复直到gap=1,这
样就使得在一定范围内数据基本有序,再通过插入排序思想进行数据的微调大大减少了排序时间。
测试数据:(gap增量选择data.length/2)
初始数据:4 2 1 5
(第一轮分组[4,1] [2,5],进行插入排序)
第一轮排序结果:1 4 2 5
(第二轮gap=1,则直接进行插入排序)
第二轮排序结果:1 2 4 5
(排序完成)
参考代码
public static int[] sort(int[] data)
{
//希尔增量以gap=data.length/2 gap/=2为准
for(int gap=data.length/2;gap>0;gap=gap/2)
{
for(int i=gap;i<data.length;i++)
{
int temp=data[i];
int j=i;
if(j-gap>=0 && data[j-gap]<temp) continue;
for(;j-gap>=0 && data[j-gap]>temp;j=j-gap)
{
data[j]=data[j-gap];
}
data[j]=temp;
}
}
return data;
}