Shell(希尔)排序

shell排序算法描述:

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数 ,即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

Shell排序示例如下:

代码实现如下:

#include<stdio.h>
void ShellSort(int arr[],int n){
	int step=n/2;		//取增量 
	while(step>=1){
		for(int i=step;i<n;i++){
			int temp=arr[i];       //从这一行开始就是直接插入排序 
			int j;
			for(j=i-step;j>-1&&temp<arr[j];j-=step){    
				arr[j+step]=arr[j];
			}
			arr[j+step]=temp;	//直接插入排序到这里结束,其实把step换成1就是直接插入排序了。 
		}
		step=step/2;    //每一次把增量除以2
	}
}

 int main(void)
 {
 	int a[8]={4,2,5,8,3,7,6,9};
 	ShellSort(a,8);
 	for(int i=0;i<8;i++)
 	printf("%4d",a[i]);
  } 

Shell排序的时间性能优于直接插入排序:

希尔排序的时间性能优于直接插入排序的原因:

①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

②当n值较小时,n和n^2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n^2)差别不大。

③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

因此,希尔排序在效率上较直接插入排序有较大的改进。

总结:Shell排序时间复杂度:在最优的情况下,时间复杂度为:O(n ^ (1.3) ) (元素已经排序好顺序)

在最差的情况下,时间复杂度为:O(n ^ 2)。它是一种不稳定的插入排序。

猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/83149334