排序---希尔(shell)排序

       希尔排序其实是改进版的插入排序,但是它是不稳定的。它的做法是使用一个增量使元素每次相隔增量的元素都被排序。增量最后一次的值为1。也就是对所有的元素进行一次插入排序。增量的选择当然是比较困难的。所幸有经验知识可以参考。

      为了让排序算法有更好的鲁棒性,我们将所有排序算法的参数都设置为一个带排序的数组以及数组的大小。实现代码如下:

//希尔排序是插入排序的一种改进的算法,但是他是不稳定的。
//改进的方法:将整个序列按照某个增量,分成若干个子序列,然后对每一个子序列进行插入排序。
//增量为1时整体序列进行一次插入排序//
void HellSort(ElementType A[],int N)
{
	int i,j,Increment;
	ElementType temp;
	for(Increment=N/2;Increment>0;Increment/=2)//控制增量,最后一次为1
		for(i=Increment;i<N;i++)               //控制分组,从增量位置到N
		{
			temp=A[i];
			for(j=i;j>=Increment;j-=Increment)//其实后两个循环就是插入排序
			{
				if(temp<A[j-Increment])
					A[j]=A[j-Increment]
				else
					break;
			}
			
			A[j]=temp;
			
		}
			
}

    这里采用了和插入排序中一样的技巧,不使用Swap函数来进行元素的交换,可以减少赋值操作,提高运行速率。

posted @ 2018-08-01 19:01  吾之求索  阅读(129)  评论(0)    收藏  举报