数据结构--希尔排序

希尔排序是一种基于插入排序的算法,通过把一个数组分成几个小数组,间隔为h,即:

假设h为4

       A   B  C  D  E  F  G  H  I  J  K  F  L  M  N  O 

①   A--------------E-------------I------------L      

 ②         B-------------F------------J-------------M

  ③            C-------------G-----------K-------------N

   ④                 D------------H------------F-------------O

①②③④都是间隔为h的小数组。

用插入排序将h个小数组独立排序,因为h-子数组是独立的,可以在h-子数组中,将每一个元素交换到比它大的元素之前去。然后

不断循环交换,直到h减到为1,排序完成。

代码:

#include<iostream>
using namespace std;
int a[31];
int n;
void set(int *a)
{
	int h = n;
	int i, j;
	do
	{
		h = h / 3 + 1;//增量
		for (i = h + 1; i <= n; i++)
		{
			if (a[i] < a[i - h])//要是前一个比后一个大就交换
			{
				//交换元素
				a[0] = a[i];
				for (j = i - h; j > 0 && a[0] < a[j]; j -= h)//这里循环是为了将间隔为h的整个小数组都进行排序
				{
					a[j + h] = a[j];
				}
				a[j + h] = a[0];
			}
		}
		for (int i = 1; i <n; i++)
		{
			cout << a[i] << " ";
		}
		cout << a[n] << endl;
	} while (h > 1);

}

int main()
{
	n = 1;
	while (cin >> a[n++]);//边输入边记录元素个数
	n -= 2;
	set(a);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值