希尔排序------排序

大体思想:先把数据分组,按组先排几遍,然后最后一次进行插入排序

举例:以三个为一组

3          4         8          6          9         5          2         6          1          7

那就3 4 8为一组,6 9 5为一组,2 6 1为一组,7为一组。

先把每组的第一个元素进行排序变成

第一组:2 4 8,第二组:3 9 5,第三组:6 6 1,第四组:7

然后把每组的的第二个元素排序:

第一组:2 4 8,第二组:3 6 5,第三组:6 9 1,第四组没有第二个,不管

然后把每组的的第三个元素排序:

第一组:2 4 1,第二组:3 6 5,第三组:6 9 8,第四组没有第三个,不管

数组此时的顺序为:

2        4        1        3        6        5        6        8        9        7

然后再把分成两组:

2 4为一组,1 3为一组,6 5为一组,6 8为一组,9 7为一组;

先按每组的第一个元素进行排序:

1 4 2 3 6 5 6 8 9 7

再按每组的第二个元素进行排序:

1 3 2 4 6 5 6 7 9 8

最后再进行一次插入排序就好了

1 2 3 4 5 6 6 7 8 9

是不是非常的简单,非常的easy。

代码实现:

#include <stdio.h>
#include <stdlib.h>
void shellsort(int [],int n);

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

void shellsort(int sz[],int n)
{
	int ad = 3;						//粗排以三个为一组
	int i,j;
	for(;ad >= 1;ad--)				//排几次 
	{
		for(i = 0;i < 10;i += ad)	//对每组的每个元素进行排序 
		{
			int k = i + ad;			//下一组元素的下标 
			int temp = sz[k];
			
			while(k >= 0 &&temp <sz[k-ad])
			{
				sz[k] = sz[k-ad];
				k -= ad; 
			}
			sz[k] = temp;
		}
	} 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值