基數排序

  1. 排序思想
    分配和收集,不進行比較,按照個位,十位,百位進行入隊出隊操作

  2. 具體描述
    分配,每一次分配根據第i位的數字進入隊列
    收集,遍歷10個隊列,根據每一個隊列的入隊順序進行收集
    最高位有幾位就分配收集幾次。

  3. 具體代碼

//基數排序
#include <stdio.h>
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
int a[] = {546, 123, 785 , 665 ,856};
int n = 5, b = 3;                //5個數字,最大的數字是3位
queue<int>que[10];
//獲取第i位
int getS(int x, int i){          //x的第i位
    while(i){
        if(!--i)return x % 10;
        x /= 10;
    }
}

//收集
void collect(){
    int j = 0;
    for(int i = 0; i < 10; i++){      //遍歷每個隊列
        while(!que[i].empty()){
            a[j++] = que[i].front();
            que[i].pop();
        }
    }
}

//分配
void arrage(int j){             //第幾次分配
    for(int i = 0; i < n; i++){
        int k = getS(a[i], j);
        que[k].push(a[i]);
    }
}

int main(){
    for(int i = 1; i <= b; i++){
        arrage(i);
        collect();
    }
    for(int i = 0; i < n; i++){
        if(i < n - 1) printf("%d ", a[i]);
        else printf("%d\n", a[i]);
    }
}

  1. 時間複雜度
    O(d(n + r))
    d :最高位的位數
    n :數字的個數
    r :隊列的個數 (有幾種數字就需要有多少個隊列 如果10進制就有10種)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章