排序算法-希尔排序

希尔排序是一种改进的插入排序算法,也称为缩小间隔排序。

算法过程

把待排序序列按下标的一定间隔分组,对每组使用直接插入排序算法排序;随着间隔逐渐减少,每组包含的元素越来越多,当间隔减至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( )复杂度的算法快得多。

 

总结

希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 

posted @ 2019-03-30 16:04  桃哥  阅读(103)  评论(0)    收藏  举报