一种shell排序实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yxw0609131056/article/details/79472525

逆序对:当 i < j且a[i] > a[j]时,(a[i],a[j])就是一个逆序对

事实证明,通过交换相邻元素而进行排序的任何算法平均需要O(N*N)时间,一个排序算法通过删除逆序对而达到排序目的的

shell排序:它通过比较相距一定间隔的元素来达到一次可以消除多个逆序对的目的,而且间隔随着算法的进行逐渐减小,直到间                  隔为1,并且由每个间隔组成的新数组可以运用插入排序算法进行排序。

增量序列: shell排序使用一个序列h1,h2,.........ht,理论上只要h1 = 1,任何增量序列都是可行的,但是使用不同的增量序                         列,算法的性能有很大的不同,因此shell建议的序列是,ht = N/2然后向下取整 ,hk = h(k+1)/2向下取整,h1 =                     1,即第一次取一半(向下取整),第二次取一半的一半(向下取整),直至h1 = 1

#include<stdio.h>

int shell_sort(int a[],int N)
{
	int i,j,k;
	int temp;
	int inc;
	for(inc=N/2;inc>0;inc=inc/2)
	{
		for(j=inc;j<N;j++)
		{
			temp = a[j];
			//注意这里是K > inc,而不是K > 0,否则k-inc可能会小于0,而导致a[k-inc]会越界
			//比如当i=1时,就会使k = k - inc > 0,但是比较temp < a[k-inc]时,a[k-inc]
			//就会发生数组越界
			for(k=j;k >= inc && temp < a[k-inc];k=k-inc)
				a[k] = a[k-inc];
			a[k] = temp;
		}
	}
	return 0;
}

int main(void)
{
	int s[] = {6,9,5,8,10,4,1,7,3,2};
	int i;
	printf("-------before---shell-sort----\n");
	for(i=0;i<10;i++)
		printf("%d ",s[i]);
	printf("\n");
	shell_sort(s,10);
	printf("-------after----shell-sort----\n");
	for(i=0;i<10;i++)
		printf("%d ",s[i]);
	printf("\n");
	return 0;
}

程序运行结果如下:


猜你喜欢

转载自blog.csdn.net/yxw0609131056/article/details/79472525