排序演算法總結(二)基數排序

2021-06-18 07:01:55 字數 1098 閱讀 4086

前文介紹過計數排序,雖然其時間複雜度為o(n),但是其輔助空間需求較大,對於乙個待排序正數陣列a其所需輔助空間為max(a),當a中數值較大時輔助空間難以接受。下面介紹一種在計數排序基礎之上改進的排序演算法基數排序,其時間複雜度為o(1),並且只消耗10個輔助空間。

基數排序原理:

假定a=我們可以按照如下規則排序:

先按照百位數字排序(百位數字小的肯定小,如果百位相同則看十位,如果十位相同則看個位)得到:

319,359,456,436,657,656,920

然後對於百位相同的按照十位排序得到:

319,359,436,456,657,656,920

然後對於十位相同的按照個位排序得到:

319,359,436,456,656,657,920

陣列完成排序。

從高位排序易於理解但是程式實現起來困難(是個樹形結構),下面我們從低位開始排序,這樣編碼方便,但是不好理解。大家可以想想,如果每次排序都是穩定

的,先按照個位排好,然後排十位,如果不看百位,僅僅將其看成2位數,按照十位排序後除去百位後的2位數是有序的(由於排序是穩定的,在個位已經有序的情況下,如果十位數字相同則相對位置不發生改變,也就不會影響整體的有序性),然後排好百位,這樣整個陣列有序,相當於執行了d次(d為數字位數)計數排序,所以其時間複雜度為o(n)。

演算法穩定性:基數排序是穩定的。

#include #include using namespace std;

void radixsort(int *input,int *output,int length,int d,int type);

int getnum(int num,int pos);

void main()

; int b[7];

int i;

radixsort(a,b,7,3,0);

for (i=0;i<7;i++)

else if (1 == type) //逆序

}memcpy(input,output,length*4); }}

int getnum(int num,int pos)

{ int i,res;

for (i=0;i

排序演算法(二)基數排序

基數排序 只能排正整數 include include include using namespace std 求最大的數的位數,來確定要做幾次迴圈排序 intmaxbit int data,int n 輔助函式,求資料的最大位數 int d 1 int p 10 while maxdata p r...

排序總結 基數排序

created by liyuanshuo on 2017 3 18.include include include include radix sort.h 基數排序是另外一種比較有特色的排序方式,它是怎麼排序的呢?我們可以按照下面的一組數字做出說明 12 104 13 7 9 1 按個位數排序是...

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...