C++数据结构 15 基数排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014183456/article/details/83272049

具体的原理可以参考这篇文章:

http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html

代码实现:

#include <iostream>
#include <list>
using namespace std;

int maxdixgit(int data[],int n)   //返回数有几位
{
    int d=1;                //基数的位数
    int p=10;               //开始设值为10,然后进行比较
    for(int i=0;i<n;++i)    //循环进行比较查看几位数
    {
       while(data[i]>=p)   //查看数是不是比10要大
       {
           p*=10;           //如果比10大,p的值*10
           ++d;            //d的位数加1
       }
    }
    return d;
}
void radixSort(int data[],int n)  //基数排序
{
  list<int> p[10];
  int s,j,i,x;
  int digit=maxdixgit(data,n);   //先返回数有几位
  for( i=0,x=1;i<digit;x*=10,++i)   //进行几次取出,排序
  {
      for( j=0;j<n;j++)  //遍历所有的数,将数放在链表中
      {
          //设一个数为n,则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10
          p[(data[j]/x)%10].push_back(data[j]);  //把数据放入链表中,x就是数取整的位
      }
      for( s=j=0;j<10;j++)  //将链表中的数取出来放入数组中
      {
          while(!p[j].empty()) //如果链表有数据
          {
             data[s++]=p[j].front();  //将数据放入数组中
             p[j].pop_front();   //删除链表中的数据
          }
      }
      for(int m=0;m<n;m++)      //查看中间结果
        cout<<data[m]<<' ';
      cout<<endl;
  }
}



int main()
{
    int a[10]={10,45,13,5,9,789,485,659,785,1023};
    radixSort(a,10);
    for(int i=0;i<10;i++)
    {
       cout<<a[i]<<' ';
    }
    cout<<endl;
    // cout << "Hello world!" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014183456/article/details/83272049
今日推荐