天天看點

基數排序

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;
}      

代碼改變世界

繼續閱讀