排序算法-希尔排序
希尔排序是一种改进的插入排序算法,也称为缩小间隔排序。
算法过程
把待排序序列按下标的一定间隔分组,对每组使用直接插入排序算法排序;随着间隔逐渐减少,每组包含的元素越来越多,当间隔减至1时,整个文件恰被分成一组,算法便终止。
间隔怎么确定,这是个数学难题,至今没有解答。Knuth提出了一个间隔序列,递归形式表示为:h=(h-1)/3
代码实现
InsertSort(int[] a, int size)
{
int step = (size-1)/3;
while(step>=1)
{
InsertSortCore(a,size,step);
if (step>1&&step<=3)
{
step = 1;
}
else if(step>3)
{
step = (step-1)/3;
}
}
}
InsertSortCore(int[] a, int size, int step)
{
for (int i=step;i<size;i++)
{
int currentValue = a[i];
int j = i-step;
if (a[j]>currentValue)
{
do
{
a[j+step] = a[j];
j = j-step;
}while (j>=0&&a[j]>currentValue)
a[j+step] = currentValue;
}
}
}
算法分析:
希尔排序的时间复杂度与增量序列的选取有关,希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(
),希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(
)复杂度的算法快得多。
总结
希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。
浙公网安备 33010602011771号