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

算法思路:采用基数排序,用10个桶(vector),每一个桶用队列表示(queue),分别代表0-9,然后依次从低位到高位开始将要排序的数倒入桶中,然后再顺序取出来,直到排序完成。

若有5个数,12,4,5,130,28

第一次(个位):

0: 130

1

2: 12

3

4: 4

5: 5

6

7

8 :28

9

然后顺序取出来,130, 12, 4, 5, 28

第二次(十位),没有十位视作0

0: 4 5

1: 12

2: 28

3: 130

4

5

6

7

8

9

然后顺序取出来,4 5 12 28 130

第三次(百位),没有百位视作0

0: 4 5 12 28

1: 130

2

3

4

5

6

7

8

9

然后顺序取出来,4 5 12 28 130

第四次(千位),都为0,退出

#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)
		{
			if(i>=result[j].length())
				vec[0].push(result[j]);
			else
				vec[result[j][result[j].length()-1-i]-'0'].push(result[j]); //result[j].length()-1-i这里的理解
														//12345这个string,当i=0时,我们想取5这个字符,但是12345
														//5在高位,1在低位,故用长度减去i就是相应位置的字符
		}

		result.clear();

		for(size_t k=0;k<vec.size();++k)// 将每一个桶内的元素按照顺序取出
		{
			while(!vec[k].empty())
			{
				result.push_back(vec[k].front());
				vec[k].pop();
			}
		}

	}
}

void 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(i=0;i<n;++i)
		cout<<result[i]<<"  ";
	cout<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值