基数排序

2017-08-28 21:27:21、

writer:pprp

基数排序,基于每一位进行的桶排序

实现起来很难,也很巧妙

代码及讲解如下:

/*
@theme: 基数排序
@writer:pprp
@start: 21:00
@end: 21:25
@declare:优化加强版的桶排序
@date:2017/8/28
*/

#include <bits/stdc++.h>
#define maxn 10    //整形排序
#define maxSize 10     //关键字个数,这里为整形位数
#define N 100

using namespace std;

int NumInPos(int num,int pos)
{
    int temp = 1;
    for (int i = 0; i < pos - 1; i++)
        temp *= 10;

    return (num / temp) % 10;
}


//data需要排序的数组,Size是数组个数
void RadixSort(int* data, int Size)
{
    int *Radix[maxn];    //分别为0~9的序列空间
    for (int i = 0; i < 10; i++)
    {
        Radix[i] = (int *)malloc(sizeof(int) * (Size + 1));
        Radix[i][0] = 0;    //index为0处记录这组数据的个数
    }
    
    //枚举当按照哪一位进行桶排序
    for (int pos = 1; pos <= maxSize; pos++)    //从个位开始到31位
    {
          //将所有的元素按照第POS位进行排序
        for (int i = 0; i < Size; i++)    //分配过程
        {
            int num = NumInPos(data[i], pos);  //第pos位的值为num
            int index = ++Radix[num][0]; //相当于一个计数器
            Radix[num][index] = data[i]; //将该位置的记录中记载下来该元素的值
        }
            //双指针 i是用来指向radix数组,进行遍历
            //       k是用来遍历i指向部分的元素
            //       j是用来指向数组data的指针,进行++
        for (int i = 0, j =0; i < maxn; i++)    //收集0- 9
        {
            for (int k = 1; k <= Radix[i][0]; k++)
                data[j++] = Radix[i][k];
            Radix[i][0] = 0;    //复位
        }
    }
}



int main()
{
      int a[N];
      for(int i = 0 ;i < 15 ; i ++)
      {
//          srand((int)time(NULL)+i);
            a[i] = rand()%1000;
            cout << a[i] <<" ";
      }
      cout << endl;     
      
      RadixSort(a,15);
      
      for(int i= 0 ; i < 15; i++)
      {
            cout << a[i] << " ";
      }
      cout << endl;
      
      
      return 0;
}
原文地址:https://www.cnblogs.com/pprp/p/7445835.html