基數排序 算法


基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度爲O (nlog(r)m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

此算法結合計數排序以空間換時間的思路進行基數數排序,元素必須爲整數(正數、負數、0)

#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <vector>
void print(std::vector<int> arr) {
    for (int i = 0; i < arr.size(); i++) {
        printf("%6d", arr[i]);
    }
    printf("\n");
}


void radixSort(std::vector<int> arr,int base) {
    int n = arr.size();		//獲取元素個數
    int radixSize = 19;		//桶個數
    int offset = 9;	//標記相對於數組0的偏移位數
    bool tag = false;  //標記是否需要遞歸
    std::vector<int> result(n, 0); //存儲最終計算結果
    std::vector<int> tmpRecord(n, 0); //存儲索引,次索引可以不存儲,但是取數據的時候需要重新映射計算
    result.resize(n, 0);
    tmpRecord.resize(n, 0);

    int mapArr[19] = {0};  //區間集合聲明用[0,18] 表示 [-9.9]
    for (int i = 0; i < n; i++) {
        int tmp = arr[i] /base;
        if (tmp > 0) {
            tag = true;
        }
        int r = tmp % 10;
        mapArr[r+offset]++;
        tmpRecord[i] = r+offset;
    }
    if (!tag) {	  //驗證排序是否完畢
        print(arr);					//打印測試
        return;
    }

    //分佈計算
    for (int i = 1; i < radixSize; i++) {
        mapArr[i] += mapArr[i - 1];
    }

     //還原
    for (int i = n-1; i>=0; i--) {
        result[mapArr[tmpRecord[i]]-1] = arr[i];
        mapArr[tmpRecord[i]]--;
    }


    if (tag) {//排序未完畢,繼續排序
        base *= 10;
        radixSort(result,base);
    }
}

void radixSort(std::vector<int> arr) {
    radixSort(arr, 1);
}


int main(){
    std::vector<int> a = { 2,5,3,0,2,3,0,-1};
    //bsort(a, 8,-1,6);
    radixSort(a);

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章