原理 在这里我想各位肯定对原理都 已经都知道的差不多了吧 那我主要是对那些了解不全,以及新手说一下我的看法 ,对本人而言桶排序就是对用到我们10进制的一些技巧 即先对个位排序,然后对十位 进行排序一直到这个数的最大分位,为什么这种方法可以实现对数组的排序呢,首先在这里我必须提醒一点 ,这个数组是由基础数组构成 比如1,2,3,4,不能是 那些结构体那之内的。好了 开始说重点了 为什么说这样排序之后数组 就一定是有序的呢 ,其实在其中你想啊 你要是先个位有序 不看别的是分位 是不是就是有序的单个数组,然后你不管个位,在对10位进行排序,假设不管其余的位,那么你的可以按照10位的数字对数组进行排序 ,又因为你是在个位的基础上实现排序,在这里我们对十位进行排序的时候需要保证我们的个位是已经排好序的,后面我会提到先进先出的概念其实就是为了在个位排好序的前提进行10位的排序,好了在这里我想大家应该懂得差不多了吧,那我们就开始进行代码了
在这里你也可以设置10个桶写 只不过我个人觉得求精比较好
#include<iostream>
#include<vector>
using namespace std;
//在这里首先求得是这个数组对应每个位的数字;
int getDigit(int x, int d)
{
return x /(int) pow(10,d-1)% 10;
}
//这个函数只要是对我们数组进行
void radixsort(vector<int>&num, int start, int end, int digit)
{
//此时我们可以让数组的任意位置实现有序 ,比如3到6
//如果你希望数组所有的都有序,没必要定义2个变量
int i = 0, j = 0;
//这是我们的一个辅助数组
//这里用向量是希望大家能够学会他很有用
vector<int>help;
help.resize(end - start + 1);
for (int d = 1; d <= digit; d++)
{
int s = 0;
int count[10] = { 0 };//看过前文都知道这个是用来做词频的
//先把个位的数做一下词频统计
for (i = start; i <= end; i++)
{
j = getDigit(num[i], d);
count[j]++;
}
//然后进行加上前一个数的词频
//看前文的解释
for (i = 1; i < 10; i++)
{
count[i] = count[i] + count[i - 1];
}
//在这里我们需要将原数组有序的排放在我们辅助向量中
//在这里实现的理论希望大家理解可有多种写法只要有序即可
for (i = start; i <= end; i++)
{
//提取中个位的数
j = getDigit(num[i], d);
if (j > 0)
help[count[j - 1]++] = num[i];
//因为对于下标是0的-1就越界了所以我们单独讨论
else
help[s++] = num[i];
}
//在将辅助数组的数据拷贝回原数组;
for (i = start, j = 0; i <= end; i++, j++)
{
num[i] = help[j];
}
}
}
int main()
{
vector<int>num = { 23, 12, 4, 5, 8, 7, 6, 43, 65, 77, 88, 123, 43 };
radixsort(num, 0, num.size() - 1, 3);
for (int data : num)
{
cout << data << endl;
}
system("pause");
return 0;
}
最后 那个求多少个分位数 你可以用代码写 ,希望各位自己完成