基數排序是一種非比較型整數排序演算法,其原理是將資料按位數切割成不同的數字,然後按每個位數分別比較。
假設說,我們要對 100 萬個手機號碼進行排序,應該選擇什麼排序演算法呢?排的快的有歸併、快排時間複雜度是 \(o(n \log n)\),計數排序和桶排序雖然更快一些,但是手機號碼位數是11位,那得需要多少桶?記憶體條表示不服。
這個時候,我們使用基數排序是最好的選擇。
我們以[ 892, 846, 821, 199, 810,700 ]
這組數字來做例子演示。
首先,建立十個桶,用來輔助排序。
先排個位數,根據個位數的值將資料放到對應下標值的桶中。
排完後,我們將桶中的資料依次取出。
那麼接下來,我們排十位數。
最後,排百位數。
排序完成。
基數排序可以看成桶排序的擴充套件,也是用桶來輔助排序,**如下:
其實它的思想很簡單,不管你的數字有多大,按照一位一位的排,0 - 9 最多也就十個桶:先按權重小的位置排序,然後按權重大的位置排序。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++;}}
資料結構與演算法 基數排序
基數排序是一種多關鍵字排序。以撲克牌排序為例,每張撲克牌有兩個 關鍵碼 花色和面值,花色的權重大於面值,如紅桃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...