8.1 算法描述
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
具体算法描述:
8.2 动图演示
8.3 代码实现
void CountingSort(vector<int> &arr,int maxValue) {
vector<int> bucket(maxValue + 1,0);
int sortedIndex = 0;
int arrLen = arr.size();
int bucketLen = maxValue + 1;
for (int i = 0; i < arrLen; i++) {
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
}
for (int j = 0; j < bucketLen; j++) {
while (bucket[j] > 0) {
arr[sortedIndex++] = j;
bucket[j]--;
}
}
}
9.1 算法描述
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
算法具体描述:
9.2 图片演示
9.3 代码实现
//桶排序
void BucketSort(vector<int> &arr,int bucketSize) {
if (arr.size() == 0) {
return ;
}
int i;
int minValue = arr[0];
int maxValue = arr[0];
for (i = 1; i < arr.size(); i++) {
if (arr[i] < minValue) {
minValue = arr[i]; // 输入数据的最小值
}
else if (arr[i] > maxValue) {
maxValue = arr[i]; // 输入数据的最大值
}
}
// 桶的初始化
int DEFAULT_BUCKET_SIZE = 5; // 设置桶的默认数量为5
bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
int bucketCount = (maxValue - minValue) / bucketSize + 1;
vector<int> tmp;
vector<vector<int>> buckets(bucketCount, tmp);
// 利用映射函数将数据分配到各个桶中
for (i = 0; i < arr.size(); i++) {
buckets[(arr[i] - minValue) / bucketSize].push_back(arr[i]);
}
arr.resize(0);
for (i = 0; i < buckets.size(); i++) {
InsertionSort(buckets[i]); // 对每个桶进行排序,这里使用了插入排序
for (int j = 0; j < buckets[i].size(); j++) {
arr.push_back(buckets[i][j]);
}
}
}
10.1 算法描述
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
算法具体描述:
10.2 动图演示
10.3 代码实现
int Maxbit(vector<int> &data)
{
int d = 1; //保存最大的位数
int p = 10;
for (int i = 0; i < data.size(); ++i)
{
while (data[i] >= p)
{
p *= 10;
++d;
}
}
return d;
}
void Radixsort(vector<int> &data) //基数排序
{
int d = Maxbit(data);
vector<int> tmp(data.size(), 0);
int count[10]; //计数器
int i, j, k;
int radix = 1;
for (i = 1; i <= d; i++) //进行d次排序
{
for (j = 0; j < 10; j++)
count[j] = 0; //每次分配前清空计数器
for (j = 0; j < data.size(); j++)
{
k = (data[j] / radix) % 10; //统计每个桶中的记录数
count[k]++;
}
for (j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
for (j = data.size() - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
{
k = (data[j] / radix) % 10;
tmp[count[k] - 1] = data[j];
count[k]--;
}
for (j = 0; j < data.size(); j++) //将临时数组的内容复制到data中
data[j] = tmp[j];
radix = radix * 10;
}
}
原文太长啦,兄弟怕各位眼疲劳了,所以特意拆解成了一个系列供大家阅读,
五分钟一篇文,就像是饭后甜点一样可口!
要想一次看完,也可以去博客查看收藏原文。
❤️❤️❤️ 如果本文对你有所帮助,请不要忘了点赞、关注、收藏一键三连哦!!!❤️❤️❤️
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:704559159@qq.com