希尔排序践行的是增量排序思想::
排序的目的,是消除原数组的逆序--》
什么叫逆序::假如期望数组array从小到大排列,但是array[m] >= array[n](m<n),这就叫数组array存在一个逆序
增量排序思想:
其它排序算法思想都是依次消除相邻位置元素的逆序,最终实现排序。
增量排序则是--》
1.选定一组增量序列::
//产生增量数列,原则--》数列的最大值t1=array.length/2
//tm = t(m-1)/2
//...
//tn = 1
2.通过n次插入排序,最终消除数组的所有逆序。
3.时间复杂度,视选定的增量序列而异,目前已知最快的时间复杂度为N7/6
希尔排序的Java实现为:
public static void sort(int[] array)
{
//产生增量数列,原则--》数列的最大值t1=array.length/2
//tm = t(m-1)/2
//...
//tn = 1
for(int gap=array.length/2;gap>0;gap--)
{
//从数组下标gap--》array.length-1,依次执行插入排序...
for(int index=gap;index<array.length;index++)
{
//即将插入的目标值
int target = array[index];
//目标值的目标index值
int targetIndex=index;
/*
* 当targetIndex>=gap&&
如果::目标值target小于或者等于targetIndex-gap下标对应的元素-->
则:targetIndex-gap下标对应的元素往后挪一格
*/
for(;
targetIndex>=gap&&target<=array[targetIndex-gap];
targetIndex-=gap)
{
array[targetIndex] = array[targetIndex-gap];
}
//把目标值放入目标index对应的位置
array[targetIndex] = target;
}
}
}