0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
78 | 09 | 63 | 30 | 74 | 89 | 94 | 25 | 05 | 69 | 18 | 83 |
步骤一:根据个位数的数字,遍历整个数组,把它们各自分配到编号0-9的桶中
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
30 | 63 83 | 74 94 | 25 05 | 78 18 | 09 89 69 |
步骤二:把所有桶中的数据按照桶号由小到大依次放回数组中,得到无序的数列
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
30 | 63 | 83 | 74 | 94 | 25 | 05 | 78 | 18 | 09 | 89 | 69 |
步骤三:按十位上的数再来一次步骤一
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
05 09 | 18 | 25 | 30 | 63 69 | 74 78 | 83 89 | 94 |
步骤四:再来一次步骤二
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
05 | 09 | 18 | 25 | 30 | 63 | 69 | 74 | 78 | 83 | 89 | 94 |
算法设计思路
①创建十个队列,编号0-9
②从个位开始,几位数就循环几次,一直到它的最高位;
对所有的数遍历,把对应位上的数插到对应的队列中
从0号队列开始,到9号结束,把该队列中的所有数都放回到数组中
排序完毕
整个程序的代码如下
#include <iostream>
#include <cmath>
using namespace std;
#define size 10 //队列的大小
#define N 10 //十进制
#define m 2 //两位数
class Queue{
private:
int *date;//存放队列数据
int front,rear;//队头队尾指针
public:
Queue()
{
date=new int[size];
front=rear=0;
}
~Queue()
{
delete []date;
front=rear=0;
cout<<"队列已清空"<<endl;
}
int Delete();
int Insert(int Elem);
bool IsEmpty()
{
return (front==rear);
}
};
int Queue::Insert(int Elem)
{
if ((rear+1)%size==front)
{
cout<<"队列已满,无法入队"<<endl;
return -1;
}
date[rear]=Elem;
rear=(rear+1)%size;
return 0;
}
int Queue::Delete()
{
if (front==rear)
{
cout<<"队列为空,不能出队"<<endl;
return -1;
}
int Elem=date[front];
front=(front+1)%size;
return Elem;
}
int main()
{
Queue SQ[N];//十个队列
int n;
cout<<"输入数组的大小:";
cin>>n;
int arr[n];
int i,j,k,t,temp;
cout<<endl<<"请输入"<<n<<"个数据:"<<endl;
for (i=0;i<n;i++)//初始化数组
cin>>arr[i];
for (i=0;i<m;i++)//几位数就循环几次
{
for (j=0;j<n;j++)//遍历n个数
{
k=(int)(arr[j]/pow(N,i))%N;//取第i位上的数
SQ[k].Insert(arr[j]);//插入k对应的队列
}
for (t=0,j=0;j<N;j++)//把N个队列的数放回数组中
{
while (!SQ[j].IsEmpty())//队列不为空时
{
temp=SQ[j].Delete();//取出队头元素
arr[t]=temp;//放入数组中
t++;
}
}
}
for (i=0;i<n;i++)
cout<<arr[i]<<endl;
return 0;
}