演算法 排序演算法之基數排序

2021-08-17 23:12:13 字數 1776 閱讀 5733

在前幾回我們已經對氣泡排序、直接插入排序、希爾排序、選擇排序、快速排序、歸併排序、堆排序、計數排序、桶排序做了說明分析。本回,將對基數排序進行相關說明分析。

一、排序演算法系列目錄說明

二、基數排序(radixsort)

基數排序(radix sort)是一種非比較型整數排序演算法。

1. 基本思想

原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。

2. 實現邏輯
3. **演示

分步圖示說明:設有陣列 array = ,對其進行基數排序:

在上圖中,首先將所有待比較數字統一為統一位數長度,接著從最低位開始,依次進行排序。

排序後,數列就變成了乙個有序序列。

4. 複雜度分析

設待排序的陣列r[1…n],陣列中最大的數是d位數,基數為r(如基數為10,即10進製,最大有10種可能,即最多需要10個桶來對映陣列元素)。

處理一位數,需要將陣列元素對映到r個桶中,對映完成後還需要收集,相當於遍歷陣列一遍,最多元素數為n,則時間複雜度為o(n+r)。所以,總的時間複雜度為o(d*(n+r))。

基數排序過程中,用到乙個計數器陣列,長度為r,還用到乙個rn的二位陣列來做為桶,所以空間複雜度為o(rn)。

基數排序基於分別排序,分別收集,所以是穩定的。

5. **實現(c++版)

int maxbit(int data, int n) //輔助函式,求資料的最大位數

int d = 1;

int p = 10;

while (maxdata >= p)

return d;

/* int d = 1; //儲存最大的位數

int p = 10;

for(int i = 0; i < n; ++i)

}return d;*/

}void radixsort(int data, int n) //基數排序

for(j = 1; j < 10; j++)

count[j] = count[j - 1] + count[j]; //將tmp中的位置依次分配給每個桶

for(j = n - 1; j >= 0; j--) //將所有桶中記錄依次收集到tmp中

for(j = 0; j < n; j++) //將臨時陣列的內容複製到data中

data[j] = tmp[j];

radix = radix * 10;

}delete tmp;

delete count;

}

三、總結

基數排序與計數排序、桶排序這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:

基數排序不是直接根據元素整體的大小進行元素比較,而是將原始列表元素分成多個部分,對每一部分按一定的規則進行排序,進而形成最終的有序列表。

演算法 排序之基數排序

基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...

排序演算法之基數排序

首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個 排序碼 花色和面值。其有序關係為 如果把所有撲克牌排成以下次序 2,a,2,a,2,a,2,a 這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。一般情況下,假定有乙個n個元素的序列 v 0,v1 vn 1 且每個元素v...

排序演算法之基數排序

如果我們要排序的資料具有多個關鍵字域,那就可以採用基數排序的方法了。基數排序的主要思想是 假如參加排序的元素最高具有d位,有的數沒有d位那麼多,則在其欠缺的高位補0,將元素先按最低位 設最右邊的位為最低位 的值進行排序,然後按次低位進行排序.最後進行最高位的排序。基數排序如果想達到理想的目的,必須滿...