1.基本思想:
希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进。该方法又称缩小增量排序.
(1)选取一个小于n的整数d1作为第一个增量,把序列的全部元素分成d1个组。
所有距离为d1的倍数的元素放在同一个组中,在各组内进行直接插人排序。
(2)选取第二个增量d2<d1重复上述的分组和排序。
(3)重复(2)步骤,直至所取的增量dx=1,整个数据合成为一组,构成一组有序记录,则完成排序。
一般而言,初始增量d1 选取序列长度n 的一半, 第二个增量d2 为 d1 的一半,即每次取上一次增量的一半。
2.算法分析:
时间复杂度: 最好O(N) 最坏:O(N^2)
空间复杂度:O(1)
稳定性:不稳定
3.算法实现:
在不同的增量下,排序操作是一样的——先按照增量分组,再组内进行排序,所以最外层为增量变化的循环。
在增量相同的情况下,各组组内操作相同,所以先进行分组。
最后,组内进行直接插入排序
(也可改进为折半插入排序 )。
总共3层for 循环。
public static void ShellInsertSort(int[] array){
int len =array.length;
//增量
for(int gap = len/2; gap > 0; gap/=2){
for(int i=0; i < gap ; i++){
//组内采用直接插入法 进行排序
for (int j =i+gap ;j < len; j += gap){
int t = array[j];
int k =j-gap;
while(k >= 0 && array[k] > t){
array[k+gap] = array[k];
k-=gap;
}
array[k+gap] = t;
}
}
}
}
注:
直接插入排序是稳定的,而希尔排序不稳定。
直接插入排序更适合原始记录基本有序的序列。
希尔排序的比较和移动次数均比直接插入排序少,n越大,效果越明显。