思想:是插入排序的改良方法,插入排序步长为1,希尔步长是从大到小调整。(成败在于步长的选择)
function shellInsertSort(arr,dk){ //对顺序表arr做一次增量为dk的希尔排序 for(var i=dk+1;i<=arr.length;++i){ if(arr[i]<arr[i-dk]){ //需将arr[i]插入有序增量子表 arr[0]=arr[i]; //暂存在arr[0] for(var j=i-dk;j>0 && arr[0]<arr[j];j-=dk){ arr[j+dk]=arr[j]; //记录后移,直到找到插入位置 } arr[j+dk]=arr[0]; } } } function shellSort(arr,dt,t){ //参数:待排记录,增量,次数 //按增量序列dt[0..t-1]对顺序表arr做t趟希尔排序 for(var k=0;k<t;++k){ shellInsertSort(arr,dt[k]); //一趟增量为dt[t]的希尔排序 } return arr; }
时间复杂度:
O(nlogn)
空间复杂度:
与插入排序一样,O(1)。
特点:
1.跳跃式的移动导致不稳定。
2.不能用于链式结构。
3.增量序列有各种取法,但应该使增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1。
4.记录总的比较次数和移动次数都比直接插入排序少,n越大效果越明显。所以适合初始记录无序,n较大的情况。