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

2021-10-18 04:34:29 字數 2344 閱讀 2855

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

氣泡排序(bubble sort)插入排序(insertion sort)希爾排序(shell sort)選擇排序(selection sort)快速排序(quick sort)歸併排序(merge sort)堆排序(heap sort)計數排序(counting sort)桶排序(bucket sort)基數排序(radix sort)

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

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

msd:先從高位開始進行排序,在每個關鍵字上,可採用計數排序

lsd:先從低位開始進行排序,在每個關鍵字上,可採用桶排序

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

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

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

分步圖示說明:設有陣列 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 是一種非比較型整數排序演算法。原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。基數排序的方式可以採用...

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

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

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

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