设计一个算法在 O(n)时间内,对 0 到 n^2-1 之间的 n 个整数进行排序。
思考:基于关键字比较的排序时间下界为O(nlogn),因此考虑用基数排序。
基数排序基本思想:
这道题目我们可以将整数表示为n进制,也就是说我们需要n个桶。
源代码(c++):
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
//将n个桶(队列)全部置空
void makenull(queue<int> q)
{
while (!q.empty())
q.pop();
}
//找到待排序数据的基数
int Radix(int data,int pass,int n)
{
int power=1;
for(int i=0;i<pass+1;i++)
power=power*n;
return (data%(power))/(power/n);
}
//基数排序
void RadixSort(int figure,queue<int> A,int n)
{
queue<int> q[n];//定义n个桶
int data,r;//data表示待排序数据,r表示待排序数据的基数
for(int pass=0;pass<figure;pass++)
{
//将队列置空
for(int i=0;i<n;i++)
makenull(q[i]);
//按基数分配
while(!A.empty())
{
data=A.front();
A.pop();
r=Radix(data,pass,n);//找基数
q[r].push(data);
}
//回收
for(int i=0;i<n;i++)
while(!q[i].empty())
{
data=q[i].front();
q[i].pop();
A.push(data);
}
}
while(!A.empty())
{
cout<<A.front()<<" ";
A.pop();
}
}
int main()
{
int n;
cin>>n;
queue<int> A;//定义队列存储产生的随机数
//产生0到n*n-1的随机数
for(int i=0;i<n;i++)
{
int a=rand()%(n*n);
A.push(a);
cout<<a<<" ";
}
cout<<endl;
//基数排序
RadixSort(2,A,n);
return 0;
}