希尔排序原理及C++源码实现


一、原理

一个成语概括:分而治之。

希尔排序是插入排序的一种,又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。

在这里插入图片描述


二、思路

先取一个小于n的整数d1作为第一个增量,把数组的全部记录分组。所有距离为d1的倍数的数据放在同一组中,先在各组内进行直接插入排序;然后,取第二个增量d2(d2<d1)重复上述的分组和排序,直至所取的增量dt=1(dt<…<d2<d1),即所有的记录放在同一组中进行直接插入排序为止。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

实例:
对数据[1, 4, 2, 6, 7, 3, 5, 10, 9]进行希尔排序。

  1. 第一次增量:9/2=4
    在这里插入图片描述
    每一组颜色代表一组,然后组内进行插入排序得到数组:[1, 3, 2, 6, 7, 4, 5, 10,9]。

  2. 第二次增量:4/2=2
    在这里插入图片描述
    每一组颜色代表一组,对组内进行插入排序得到数组:[1, 3, 2, 4, 5, 6, 7, 10,9].

  3. 第三次增量:2/2=1,这时候直接对数组使用插入排序进行排序,得到数组:[1, 2, 3, 4, 5, 6, 7, 9,10]。


三、希尔排序特点

  • 在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,因此希尔排序是不稳定的。
  • 不需要大量的辅助空间,和归并排序一样容易实现。时间复杂度为O(n3/2),时间复杂度下界是n*log2n。
  • 希尔排序没有快速排序快,中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n2)复杂度的算法快得多。
  • 希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。
  • 几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法。

四、C++源码实现


void shellSort(int arr[], int len)
{
    
    
	int gap=0;	//增量
	int i=0, j=0;
	int temp=0;

	for(gap=len/2; 0 < gap; gap /= 2) //每次增量都是取上次的一般半
	{
    
    
		//增量的位置右边后面所有的元素都要遍历比较
		for(i=gap; i<len; i++) 
		{
    
    
			temp=arr[i];
			//与i位置前面的数值做比较,若左边的值比右边的大则交换位置
			//比较交替位置以增量为差值
			for(j=i-gap; 0 <=j && temp < arr[j]; j=j-gap) 
			{
    
    
				Arr[j+gap]=arr[j];
			}
			arr[j+gap]=temp;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/locahuang/article/details/110181147
今日推荐