鏈式基數排序空間複雜度 演算法 排序演算法之基數排序

2021-10-18 04:34:29 字數 1830 閱讀 3904

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

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

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

① 將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。

② 從最低位開始,依次進行一次排序。

③ 這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

基數排序動態演示

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

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

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

時間複雜度:o(k*n)

空間複雜度:o(k + n)

穩定性:穩定

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

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

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

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

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;

}

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

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

鏈式基數排序空間複雜度 演算法 排序演算法之基數排序

在前幾回我們已經對 演算法 排序演算法之氣泡排序 演算法 排序演算法之插入排序 演算法 排序演算法之希爾排序 演算法 排序演算法之選擇排序 演算法 排序演算法之快速排序 演算法 排序演算法之歸併排序 演算法 排序演算法之堆排序 演算法 排序演算法之計數排序 演算法 排序演算法之桶排序做了說明分析。本...

鏈式基數排序空間複雜度 帶你快速了解基數排序的原理

基數排序 radix sort 屬於 分配式排序 distribution sort 是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串 比如名字或日期 和特定格式的浮點數,所以基數排序也不是只能使用於整數。基數排序法是屬於穩定性的排序...

排序演算法之 基數排序 及其時間複雜度和空間複雜度

基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配 至某些 桶 中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度 為o nlog r m...