【排序算法】基数排序(RadixSort)

基数排序:它不是比较关键字的大小,它是根据关键字中各位的值,通过对待排序的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);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值