希尔排序
一、定义
希尔排序又称缩小增量排序,它也是一种插入排序类方法,但在时间效率较前几种有较大的的改进。
二、具体实现
先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
void shellInsert(ElementType list[],int dk,int i){//直接插入排序
ElementType temp;
temp = list[i];
int j = i - dk;
for(; j >= 0 && list[j] > temp; j -= dk)
list[j + dk] = list[j];
list[j + dk] = temp;
}
void shellSort(ElementType list[],int n){
for(int dk = n / 2;dk > 0; dk = dk / 2){//计算增量
for(int i = dk;i < n; i++){//确定增量后,从第一组开始,逐个对各组进行直接插入排序。
shellInsert(list,dk,i);
}
}
}
三、分析
希尔排序的分析是个复杂的问题,因为它的时间是所取“增量"的序列函数,这涉及一些数学上尚未解决的难题。应使增量序列中的值没有除1以外的公因子,并且最后一个增量值必须等于1。
直接插入排序时间复杂度T(n) = O(n^2),在记录较少、基本有序是效率较高的,但数据量比较大时就不高效了,所以当数据量大,数据无序时就使用希尔排序,这正是希尔排序分割子序列带来的高效之处。
最佳情况:T(n) = O(nlogn)。最坏情况:T(n) = O(n^2)。平均情况:T(n) = O(nlogn)。希尔排序是不稳定的排序算法。