码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法之(6)——基数排序

时间:2015-07-04 11:18:31      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:基数排序   排序算法   

【基数排序的思想】

首先使用基数r=10进行分解,将每个整数分成d位(d是待排元素中的最大位数),每位的取值范围是0~9;因为每一位有10种可能的情况,所以建立10个链表,即lists[0]~list[9],分别代表相应位为0、1、2、3、4、5、6、7、8、9。然后执行下列步骤:
(1)第一趟:按照个位数,将元素放入相应链表中,若元素的个数为0,则放入链表lists[0]中,若元素的个数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素已经按个位排好序。
(2)第二趟:将(1)得到的整数序列按照十位数,将元素放入相应链表中,若元素的十数为0,则放入链表lists[0]中,若元素的十数为1,则放入链表lists[1]中………………;然后按照链表的顺序(lists[0]->list[1]->list[2]………….)将链表中的元素重新拿出来,此时全部元素也按十位排好序。
.
.
.
.
总共进行d趟排序。
经过d趟排序后,此时所有元素的每一位都排好序,即所有元素有序。

【代码实现】

#include<iostream>
#include<list>
using namespace std;
int maxdigit(int data[],int n)
{
  int d=1;
  int p=10;
  for(int i=0;i<n;i++)
  {
    while(data[i]>=p)
    {
      p=p*10;
      d++;
    }
  }
  return d;
}
void radixsort(int data[],int n)
{
   int digits=maxdigit(data,n);
   list<int> lists[10];  //基数为10,定义10个链表
   //---依次按个位、十位、百位....进行排序----
   for(int d=1,factor=1;d<=digits;factor*=10,d++)
   { 
       //-----元素进链表----
       for(int j=0;j<n;j++)  
       {
         lists[(data[j]/factor)%10].push_back(data[j]); //根据元素的相应位进链表
       }
       //---把链表里的元素重新拿出来---
       int k=0;
       for(int j=0;j<10;j++)  
       {
         while(!lists[j].empty())
         {
          data[k]=lists[j].front();
          lists[j].pop_front(); 
          k++;
         }
       }
       //---查看中间结果----
       cout<<"第"<<d<<"趟结果:";
      for(int i=0;i<n;i++)
      {
        cout<<data[i]<<" ";
      }
      cout<<endl;
   }
}
int main()
{
    int data[10]={170, 201, 45, 2, 789, 4, 456, 56, 8, 47};
    radixsort(data,10);
    cout<<"排序结果:";
    for(int i=0;i<10;i++)
    {
     cout<<data[i]<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

【程序结果】

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

排序算法之(6)——基数排序

标签:基数排序   排序算法   

原文地址:http://blog.csdn.net/adminabcd/article/details/46753535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!