-
排序思想
分配和收集,不進行比較,按照個位,十位,百位進行入隊出隊操作 -
具體描述
分配,每一次分配根據第i位的數字進入隊列
收集,遍歷10個隊列,根據每一個隊列的入隊順序進行收集
最高位有幾位就分配收集幾次。 -
具體代碼
//基數排序
#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]);
}
}
- 時間複雜度
O(d(n + r))
d :最高位的位數
n :數字的個數
r :隊列的個數 (有幾種數字就需要有多少個隊列 如果10進制就有10種)