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

2021-10-18 04:34:29 字數 1825 閱讀 5436

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

取得陣列中的最大數,並取得位數;

arr為原始陣列,從最低位開始取每個位組成radix陣列;

對radix進行計數排序(利用計數排序適用於小範圍數的特點);

9.2 **演示

**實現:

//找出最大數,獲得它的位數int getmaxbit(int arr, int n) int bit = 1;while (max >= 10)return bit;}void radixsort(int arr, int n)//記錄每個基數的當前可用的第乙個位置,比如基數為0的有2個,基數為1的有3個,則基數為0的第乙個可用位置是0,基數為//1的第乙個可用位置為2,因為前面已經有了兩個基數為0的數,基數為1的第二個可用位置為3,以此類推int pos = count[0];int temp;for (j = 1; j < 10; j++)count[0] = 0;//將所有桶中記錄依次收集到tmp中for (j = 0; j < n; j++)//將臨時陣列的內容複製到arr中for (j = 0; j < n; j++)arr[j] = tmp[j];radix = radix * 10;}deletetmp;deletecount;}
其中要注意更改count陣列的這一段**,是我自己喜歡這樣寫,我覺得更符合常規的思維:

//記錄每個基數的當前可用的第乙個位置,比如基數為0的有2個,基數為1的有3個,則基數為0的第乙個可用位置是0,基數為//1的第乙個可用位置為2,因為前面已經有了兩個基數為0的數,基數為1的第二個可用位置為3,以此類推int pos = c[0];int temp;for (j = 1; j < 10; j++)count[0] = 0;//將所有桶中記錄依次收集到tmp中for (j = 0; j < n; j++)
通常的寫法是如下這樣的,大家可以對比一下這兩種寫法,選用自己更容易理解的實現方法。

for (i = 1; i < 10; i++)    count[i] += count[i - 1]; // 將資料儲存到臨時陣列output中for (i = n - 1; i >= 0; i--)

基數排序的效能比桶排序要略差,每一次關鍵字的桶分配都需要o(n)的時間複雜度,而且分配之後得到新的關鍵字序列又需要m的時間複雜度,m為桶的個數。假如待排資料可以分為k個關鍵字,則基數排序的時間複雜度將是o(k*(n+m)) ,通常n>>m,因此基本上還是線性級別的。

基數排序的空間複雜度為o(n+m),其中m為桶的數量。通常n>>m,因此額外空間需要大概n個左右。

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

在前幾回我們已經對氣泡排序 直接插入排序 希爾排序 選擇排序 快速排序 歸併排序 堆排序 計數排序 桶排序做了說明分析。本回,將對基數排序進行相關說明分析。基數排序 radix sort 是一種非比較型整數排序演算法。原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。基數排序的方式可以採用...

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

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

快速排序的時間複雜度與空間複雜度

我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...