#include<bits/stdc++.h>
using namespace std;
/*
*计数排序:A和B为待排和目标数组,k为数组中最大值,len为数组长度
*/
/* 实际上就只是从1到n统计出现数的个数的前缀,这即是顺序。从后往前取数是为了令相同的数保持原顺序,实现算法的稳定性*/
void CountingSort(std::vector<int> a, std::vector<int> &ans, int maxV, int len) //若需要传递实参只需在函数声明中加&
{
std::vector<int> C(maxV+1);//hash存呗!
for(int i=0; i<len; ++i)
C[a[i]] += 1; //C数组统计出现个数
for(int i=1; i<maxV+1; ++i)
C[i] = C[i] + C[i-1]; //个数的前缀和
for(int i=len-1; i>=0; --i)
{
ans[C[a[i]]-1] = a[i];
C[a[i]] -= 1;
}
}
/* 输出数组 */
void print(std::vector<int> ans, int len)
{
for(int i=0; i<len; ++i)
cout << ans[i] << " ";
cout << endl;
}
/* 测试 */
int main()
{
int A[8] = {4,5,3,0,2,1,15,6};
std::vector<int> a(8); //vector 可以和数组一样初始哦!
copy(A, A+8,a.begin());
int maxVal = -0x3f3f3f;
for (int i = 0; i < (int)a.size(); ++i)
{
maxVal = max(maxVal, a[i]);
}
cout << maxVal << endl;
std::vector<int> ans((int)a.size());
print(a, (int)a.size());
CountingSort(a, ans, maxVal, (int)a.size());
print(ans, ans.size());
return 0;
}
计数排序
最新推荐文章于 2022-12-17 15:51:36 发布