0
点赞
收藏
分享

微信扫一扫

162 3. 让你排序N个比N^7小的数,要求的算法是O(n)

冬冬_79d4 2023-02-20 阅读 58


3. 让你排序N个比N^7小的数,要求的算法是O(n)(给了提示..说往 N 进制那方面想)


/*
3. 让你排序N个比N^7小的数,要求的算法是O(n)(给了提示..说往 N 进制那方面想)

空间换时间,开一个N^7大的数组,有数的位置就标记,然后遍历一遍
复杂度是?

用基数排序 对每位排序
基数排序已经可以 O(n)了,准备 10个 vector<int>,从最低位数字开始,
放入相应的桶里,然后再顺序取出来, 然后再从次低位放入相应桶里, 在顺序取出来
*/
#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
size_t n; //n个数
size_t maxLen=0; //最大的数字位数
vector< queue<string> > vec(10); //10个桶
vector<string>result;

void sort()
{
for(size_t i=0;i<maxLen;++i) //最大的数字位数
{
for(size_t j=0;j<result.size();++j) //n个数
{
if(i>=result[j].length())
vec[0].push(result[j]);
else
vec[ result[j][result[j].length()-1-i]-'0' ].push(result[j]);
}
result.clear();

for(size_t k=0;k<vec.size();++k)
{
while(!vec[k].empty())
{
result.push_back(vec[k].front());
vec[k].pop();
}
}
}
}
int main()
{
cin>>n;
string input;
for(size_t i=0;i<n;++i)
{
cin>>input;
result.push_back(input);
if(maxLen==0||input.length()>maxLen)
maxLen=input.length();
}
sort();
for(size_t i=0;i<n;++i)
cout<<result[i]<<" ";
cout<<endl;
return 0;
}
/*
5
4 10 7 123 33
*/



举报

相关推荐

0 条评论