一、希尔排序
首先我们需要找到希尔排序的原理。
希尔排序(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,从个位到十位,十位到百位等等
}
}
结果: