資料結構與演算法 基數排序

2022-09-29 00:21:26 字數 1284 閱讀 4463

基數排序是一種非比較型整數排序演算法,其原理是將資料按位數切割成不同的數字,然後按每個位數分別比較。

假設說,我們要對 100 萬個手機號碼進行排序,應該選擇什麼排序演算法呢?排的快的有歸併、快排時間複雜度是 \(o(n \log n)\),計數排序和桶排序雖然更快一些,但是手機號碼位數是11位,那得需要多少桶?記憶體條表示不服。

這個時候,我們使用基數排序是最好的選擇。

我們以[ 892, 846, 821, 199, 810,700 ]這組數字來做例子演示。

首先,建立十個桶,用來輔助排序。

先排個位數,根據個位數的值將資料放到對應下標值的桶中。

排完後,我們將桶中的資料依次取出。

那麼接下來,我們排十位數。

最後,排百位數。

排序完成。

基數排序可以看成桶排序的擴充套件,也是用桶來輔助排序,**如下:

void sort(vectorarr)

}// 當前排序位置

int location = 1;

// 桶列表

vector> bucketlist(10);

while(true)

// 資料入桶

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

// 寫回陣列

int nn = 0;

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

bucketlist[i].clear();

}location++;}}

其實它的思想很簡單,不管你的數字有多大,按照一位一位的排,0 - 9 最多也就十個桶:先按權重小的位置排序,然後按權重大的位置排序。

資料結構與演算法 基數排序

基數排序是一種多關鍵字排序。以撲克牌排序為例,每張撲克牌有兩個 關鍵碼 花色和面值,花色的權重大於面值,如紅桃a小於黑桃2。通常有最高位優先msd most significant digit first 和最低位優先lsd least significant digit first 兩種實現方式。...

資料結構與演算法系列 基數排序

基數排序與其他的排序方法 都不同,它不需要比較關鍵字的大小。演算法的時間複雜度是o n 相比於快速排序的o nlgn 從表面上看具有不小的優勢.但事實上可能有些出入,因為基數排序的n可能具有比較大的係數k.因此在具體的應用中,應首先對這個排序函式的效率進行評估.它是根據關鍵字中各位的值,通過對排序的...

資料結構 排序演算法之計數排序與基數排序

一 計數排序 很好理解,就是對應每個數我們統計每個數字出現的次數,然後用乙個直接定址的雜湊表來存放資料,在通過遍歷這個雜湊表,進而就可以排好序了 如下所示 實現如下所示 void countsort int array,int size 開闢輔助空間 int range maxdata mindat...