基數排序(radix sort)是桶排序的擴充套件,它的基本思想是:將整數按位數切割成不同的數字,然後按每個位數分別比較。(桶排序可以參考:我的另一篇部落格)
具體做法是:將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。
通過基數排序對陣列,它的示意圖如下:
在上圖中,首先將所有待比較樹脂統一為統一位數長度,接著從最低位開始,依次進行排序。
按照個位數進行排序。
按照十位數進行排序。
按照百位數進行排序。
排序後,數列就變成了乙個有序序列。
/*
基數排序思路:
基數排序(radix sort)是桶排序的擴充套件,它的基本思想是:
將整數按位數切割成不同的數字,然後按每個位數分別比較。
具體做法是:將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。
然後,從最低位開始,依次進行一次排序。
這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。
*/#include/*
* 獲取陣列data中最大值
* * 引數說明:
* data -- 陣列
* n -- 陣列長度
*/int getmax(int data, int n)
/* * 列印data陣列元素以及顯示提示資訊
* * 引數說明:
* data -- 陣列
* n -- 陣列長度
* str -- 提示資訊
*/ void print_array(int data, int n,char *str)
printf("\n ");
}/** 對陣列按照"某個位數"進行排序(桶排序)
* * 引數說明:
* data -- 陣列
* n -- 陣列長度
* exp -- 指數。對陣列a按照該指數進行排序。
* * 例如,對於陣列a=;
* (01) 當exp=1表示按照"個位"對陣列a進行排序
* (02) 當exp=10表示按照"十位"對陣列a進行排序
* (03) 當exp=100表示按照"百位"對陣列a進行排序
* ...
*/void countsort(int data, int n, int exp)
; // 將資料出現的次數儲存在buckets中
//(data[i]/exp)%10 表示為data[i]的某個位上的數字(由exp決定)
for (i = 0; i < n; i++)
buckets[ (data[i]/exp)%10 ]++;
print_array(buckets,10, "buckets1");
// 更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在output中的位置。
for (i = 1; i < 10; i++)
buckets[i] += buckets[i - 1];
print_array(buckets,10, "buckets2");
// 將資料儲存到臨時陣列output中
for (i = n - 1; i >= 0; i--)
print_array(buckets,10, "buckets3");
// 將排序好的資料賦值給a
for (i = 0; i < n; i++)
data[i] = output[i];
print_array(data,n, "data");
printf("------完成一次桶排序--------\n\n ");}/*
* 基數排序
* * 引數說明:
* data -- 陣列
* n -- 陣列長度
*/void radix_sort(int data, int n)
int main()
; int ilen = (sizeof(data)) / (sizeof(data[0]));
printf("排序前的資料為:\n ");
對於給定的n個d位數,取值範圍為[0,r],我們使用計數排序比較元素的每一位,基數排序耗時o(n+r),那麼基數排序的複雜度為o(d(n+r))。
我們還是和快速排序進行比較,僅僅從漸進性來看,基數排序比快速排序要好,但是隱藏在θ符號後面的常數項因子是不同的,基數排序迴圈次數比快速排序迴圈次數少,但是基數排序每次迴圈會比快速排序長。更多的時候我們使用哪一種是通過輸入資料的特徵以及主存容量是否寶貴來決定的。當我們需要原址排序或者主存容量寶貴的時候我們就更傾向於快速排序這樣的原址排序。
排序方法
時間複雜度(平均)
時間複雜度(最壞)
時間複雜度(最好)
空間複雜度
穩定性基數排序
o(d(n+r))
o(d(n+r))
o(d(n+r))
o( r )
穩定參考:
排序演算法 基數排序
基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...
排序演算法 基數排序
一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...
排序演算法 基數排序
基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...