基数排序:它不是比较关键字的大小,它是根据关键字中各位的值,通过对待排序的n个元素进行若干趟“分配”与“收集”来实现排序的。
设待排序的线性表中每个元素的关键字都是d位的十进制正整数。在排序的过程中需要对该线性表进行d次的分配与收集处理,每趟处理方法是相同的。在进行第j(j=1,2,...,d)次处理时,首先按元素在线性表中的排列顺序,依次将每个元素插入到编号为0~9的某个队列(关键字右起第j位上的值是多少就插入几号队列),这个过程叫做分配;然后按队列的标号从大到小,同一队列按插入先后的顺序,从队列中取出所有元素,重新构成一个线性表,这个过程叫做收集。在进行了d次的分配和收集之后,排序过程结束。
算法实现如下:
#include<iostream>
#include<queue>
using namespace std;
/*基数排序*/
int digitk(int Num,int k) //获取数字第k位,1代表个位
{
int i=0;
int temp=0;
while(Num)
{
temp=Num%10;
Num=Num/10;
i++;
if(i==k)
{
break;
}
}
if(k>i)
temp=0;
return temp;
}
void RadixSort(int Array[],int Len,int dMax)//Len为数组长度,dMax为数字的位数
{
queue<int> *head=new queue<int>[10]; //创建10个队列,来保存各位为0,1...9.
int i,j,k,temp;
int m=0;
for(i=1;i<=dMax;i++)
{
//分配
for(j=0;j<Len;j++)
{
temp=digitk(Array[j],i); //获取Array[j]的第i位数字
head[temp].push(Array[j]);
}
//收集
for(k=0;k<10;k++)
{
while(!head[k].empty())
{
Array[m++]=head[k].front();
head[k].pop();
}
}
m=0;
Display(Array,Len);
}
delete [] head;
}
void main(int argc,char *argv[])
{
int Array[]={35,44,46,9,23,202,10,124};
int Len=sizeof(Array)/sizeof(int);
RadixSort(Array,Len,3);
printf("排序好的数组为:");
Display(Array,Len);
}