#include<iostream>
#include<vector>
using namespace std;
//计数排序
//计数排序假设每个元素都是在0到max之间的一个整数。
//基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。
//时间复杂度为:T(n)=O(max+n),因此当k小于等于n,也就是当max=O(n),max和n同阶时,采用计数排序的时间复杂度为T(n)=O(n)
//计数排序也是一种稳定的排序算法。
void CountSort(vector<int> &vec)
{
int max = -1; //求出vec中最大的数,那么所有的数都是在[0,max]区间中,可能会有max+1个不同的数
for (int i = 0; i <= vec.size() - 1; i++)
{
if (max < vec[i])
{
max = vec[i];
}
}
vector<int> count(max+1); //初始化max+1个值为0的数,用以在vec每个元素对应位置上保存自身出现的次数
for (int i = 0; i <= vec.size() - 1; i++) 统计vec[j]元素出现的次数,保存到count计数数组中
{
count[vec[i]]++;
}
for (int i = 1; i <= count.size() - 1; i++) // 统计小于或等于每个元素的个数
{
count[i] = count[i] + count[i - 1];
}
vector<int> temp(vec.size());
for (int i = vec.size() - 1; i >= 0; i--) //将每一个元素暂时放到temp数组中对应的位置上
{
temp[count[vec[i]] - 1] = vec[i];
count[vec[i]]--; //由于有可能有相同元素存在,所以,每次将vec[i]元素放入B数组中,都要将vec[i]的个数减一,这样当遇到下一个值等于vec[i]的元素时,该元素就能放在输出数组中vec[i]的前面
}
for (int i = 0; i <= vec.size() - 1; i++) //复制到vec中用以返回
{
vec[i] = temp[i];
}
}
//基数排序
//如果基数排序使用的稳定排序算法的时间复杂度为O(n + k),要循环d轮,每轮耗时为O(n + k),那么基数排序的时间复杂度为T(n) = O(d(n + k))
//稳定排序
void sort(vector<int> &vec)
{
int bit_max = 1; //求所有数中的最大位
int flag = 10;
for (int i = 0; i <= vec.size() - 1; i++)
{
while (vec[i] >= flag) //如果遇到大于flag的数,就求这个数的最高位
{
flag *= 10;
bit_max++;
}
}
flag = 1; //从低位开始比较
for (int i = 1; i <= bit_max; i++) //对每一位上的所有数据依次进行计数排序,共bit_max趟排序
{
vector<int> count(10); //每个位上的数字都在[0,9]区间中
for (int j = 0; j <= vec.size() - 1; j++) //统计此位上所有数的次数保存在count数组的对应数的对应位置上
{
int k = (vec[j] / flag) % 10;
count[k]++;
}
for (int j = 1; j <= count.size() - 1; j++) //统计此位上小于或等于每个元素的数的个数
{
count[j] = count[j] + count[j - 1];
}
vector<int> temp(vec.size());
for (int j = vec.size()-1; j >= 0; j--) //将数组中的每一个元素按此位上的数字顺序摆放在temp数组中
{
int k = (vec[j] / flag) % 10;
temp[count[k]-1] = vec[j];
count[k]--; //由于有可能有相同元素存在,所以,每次将vec[i]元素放入B数组中,都要将vec[i]的个数减一,这样当遇到下一个值等于vec[i]的元素时,该元素就能放在输出数组中vec[i]的前面
}
for (int j = 0; j <= vec.size() - 1; j++)
{
vec[j] = temp[j];
}
flag *= 10; //升高位数比较
}
}
int main()
{
vector<int> vec = { 3,7,8,2,1,4,6,11,25 };
for (unsigned int i = 0; i <= vec.size() - 1; i++)
{
cout << vec[i] << " ";
}
cout << endl;
sort(vec);
for (unsigned int i = 0; i <= vec.size() - 1; i++)
{
cout << vec[i] << " ";
}
system("pause>nul");
return 0;
}
基数排序算法
最新推荐文章于 2024-01-17 05:15:00 发布