1、采用先分配后收集的思想来对数据进行排序
2、举例基数排序(先按最低位排序依次分配到10个不同的数组中去),也可以采用从高到低的方法但这样明显会利用到递归的思想
基数排序
3、采用链式存储方式则可克服时间和空间消耗问题。
基数排序时间复杂性基于基数和排序码的长度,每执行一次分配和收集,队列初始化需要O(r)时间,分配工作需要O(n)时间,收集工作需要O(r)时间,每趟O(n + 2r)时间,进行d趟共需要O(d + 2r)时间
4、采用顺序结构的方式,用一个数组存放待排序的n个记录,用r个数组存放r个队列,每个队列大约需要n个记录空间。
每分配一次,需要移动n个记录,每收集一次也需要移动n个记录,d趟分配和收集需要移动2*n*d个记录,且需要r-n个附加的记录空间。
#include<bits/stdc++.h>
using namespace std;
//基数排序:从小到大
template<class T>
void rSort(T a[], int n)//n表示数组里的个数
{
queue<T> que[10];
//确定回合数R
int R=0;
T mx=a[0];
for(int i=1; i<n; i++) //找最大值mx
{
mx = max(a[i], mx);
}
while(mx)
{
R++;
mx /= 10;
}//找最大位数
//cout<<"R="<<R<<endl; //***
//基数排序
int d = 1;
for(int i = 1; i <= R; i++)
{ //将数据分配到10个队列中
for(int j = 0; j < n ; j++)
{
int t = a[j] / d % 10;
que[t].push(a[j]);
}
d *= 10;
//收集10个队列里的数据
int p = 0;
for(int j=0; j<10; j++)
{
while(que[j].size())
{
a[p++] = que[j].front();//将第一次排好序的数据放会a数组中
que[j].pop();
//cout<<a[p-1]<<" "; //***
}
//cout<<endl; //***
}
}
}
int main()
{
int a[10]={0,45,723,23,3,45,5,8,9,12345};
rSort(a, 10);
for(int i=0; i<10; i++) cout<<a[i]<<" ";
return 0;
}