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

一、希尔排序

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

        希尔排序(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,从个位到十位,十位到百位等等
	}
}

结果:

猜你喜欢

转载自blog.csdn.net/q244645787/article/details/126687751