数据结构之希尔排序和桶排序

本文详细介绍了两种排序算法:希尔排序和桶排序。希尔排序通过设置不同的增量对序列进行分组,然后使用直接插入排序,逐步减少增量直至为1,实现快速排序。桶排序则是根据元素值域创建多个桶,对每个桶分别排序,最后按照顺序组合所有桶中的元素,完成排序过程。这两种算法在特定场景下能有效提高排序效率。
摘要由CSDN通过智能技术生成

一、希尔排序

        首先我们需要找到希尔排序的原理。

        希尔排序(shell):希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。

        如图所示:

 所以

void test_shell(int* a, int len)//希尔排序 
{
	int step = len / 2;		//步长
	int temp;				//用于储存临时待插数据
	int j;					//
	while (step)	//步长一直到0为止
	{
		for (int i = step; i < len; i++)//步长进行分组,组内进行插入
		{
			temp = a[i];//储存临时待插数据
			for (j = i - step; j >= 0 && a[j] > temp; j -= step)
			{
				a[j + step] = a[j];
			}
			a[j + step] = temp;
		}
		step /= 2;
	}
}

测试:

 二、桶排序

        桶排序,也叫箱排序,我们要确定桶的大小与个数,一般根据要排序的元素的值域区间取定。

        比如我有10个数据,对其进行桶排序,那么我们就以0-9做十个箱子

如图:

         那么第一步,我们要的是升序,所以我们可以通过位数来进行分割,从个位开始(想要降序可以从百位开始)。

        

 然后再对十位进行排序:

        

 最后再是百位排序,就会发现,除了132在1的位置,其他都是有序排在0的位置

 以上便是桶排序的原理,所以代码如下:

void tong_test(int* a, int len)
{
	int wei = 1;     //开始是个位
	int data_wei;    //用来存放位上面的数值
	int** p = new int* [10];    //创建十个箱子
	for (int i = 0; i < 10; i++)
	{
		p[i] = new int[len];    //每个箱子都有原数组的长度
	}
	while (wei < 1000)            //这个值是可以自己替换的,我这里没有大于千位的数,就写了1000
	{
		for (int i = 0; i < 10; i++)
		{
			for (int k = 0; k < len; k++)
			{
				p[i][k] = -1;    //这是对箱子内部数据的初始化,为-1
			}
		}
		for (int i = 0; i < len; i++)
		{
			data_wei = a[i] / wei % 10;    //对个,十,百位进行计算放在哪个箱子里面
			p[data_wei][i] = a[i];
		}
		int j = 0;
		for (int i = 0; i < 10; i++)
		{
			for (int k = 0; k < len; k++)
			{
				if (p[i][k] != -1)        //将放入箱子的数据重新存入数组里面
				{
					a[j++] = p[i][k];
				}
			}
		}
		wei *= 10;      //位数*10,从个位到十位,十位到百位等等
	}
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多方通行8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值