基本排序算法总结与对比 之四 ——希尔排序
1、希尔排序
希尔排序实质是不断对数组分组,并对每组数据进行插入排序,分组由 len/step组 直到 1组(len为数组长度,step为分组长度)。
本质上讲,希尔排序算法是直接插入排序算法的一种改进,分组后数据移动长度变短,减少了其复制的次数,速度要快很多。
template<typename T>
void shellSort(T arr[], int lo, int hi)
{
for(int step = (hi - lo) >> 1; step > 0; step >>= 1) //步长从数列长度的一半开始,每轮对折;步长 = 子数组的个数;子数组中相邻俩元素 对应 原数组中 下标相差 一个步长的俩元素
{
for(int i = 0; i < step; i++) //对每一个子数组都要进行直接插入排序,共step个子数组
{
//一下跟直接插入排序步骤一样,区别在于 子数组相邻元素 对应到 原数组中 下标差 为step
for(int j = lo + i + step; j < hi; j += step) //原数组[lo+i] 为 各子数组[lo]
{ //原数组[lo+i+step] 为 各子数组[lo+1]
tmp = arr[j];
int k = j - step;
while(k >= lo + i && arr[k] > tmp)
{
arr[k + step] = arr[k];
k -= step;
}
arr[k + step] = tmp;
}
}
}
}
希尔排序的复杂度要比直接插入排序法的O(n^2)好一些,平均为O(n^1.5)左右,希尔排序也不是稳定的排序算法。需要注意的是:希尔排序并不像网上有流传的比 快速排序 还快!