java 實現 常見排序演算法(四)基數排序

2021-08-29 23:26:18 字數 2102 閱讀 4470

今天分享一下基礎排序演算法之基數排序。

原理:基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort。

將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

思路:基數排序,即乙個數字乙個數字地進行排序,平常生活中我們經常使用的一種演算法思想:如要對乙個日期進行排序,日期中由年、月、日組成的,對於這個問題,我們經常使用的是先比較年份,如果相同再比較月份,如果還相同就比較日。

下面四個數進行排序:123、312、245、531

個位 =>  十位 =>  百位 53

13

12      

123 31

21

23      

245 12

35

31      

312 24

52

45      

531

**實現:

/**

* 基數排序

* @param d

* @param array

* 時間複雜度 o的log2 n

* 基數排序 運用二維陣列來分別比較每一位,個位、十位、百位…

* 輸入10個整數的陣列

*/private void radixsort(int d,int array)

for(int i=0;i基數排序是穩定演算法,效率很高,其複雜度為o(nlog(r)m),其中r為所採取的基數,而m為堆數。但它只能用在整數的排序中,且需要借助一定的輔助空間。

上面的**適用有些侷限在於對基數值選取:

int x = ;

比如這個陣列,基數應該選3。附上乙個選擇基數值的方法。

/**

* 獲取基數排序中的基數

* @param array

* @return

*/public int getradixbasicnumber(int array)

int max =0;

//1獲取最大的絕對值的數

for(int i =0;i0)

return times;

}

耗時對比:10w 條隨機 資料 執行如圖:

分別對比了基數排序,直插排序,希爾排序和快速排序。差距很明顯。

50w 條隨機 資料 執行如圖:

分別對比了基數排序,直插排序,希爾排序和快速排序。差距很明顯。

100w 條隨機 資料 執行如圖:

分別對比了基數排序,直插排序,希爾排序和快速排序。差距很明顯。

基數排序

優點:效率高。

缺點:占用記憶體大,只能對正整數排序(採用二維陣列做桶時)

最壞時間複雜度:o(p(n+b))。

平均時間複雜度為:o(p(n+b))。

其中p是排序的趟數,n是要被排序元素的個數,b是桶數。

各種排序方法比較:

氣泡排序   :  

插入排序   : 

快速排序   :  

排序演算法之 基數排序(Java實現)

今天,我來講一講基數排序。基數排序是一種用在老式穿卡機上的演算法。一張卡片有80列,每一列可以在12個位置中的任一處穿孔。排序器可以被機械地 程式化 以便對一疊卡片中的每一列進行檢查,再根據穿孔的位置將它們放入12個盒子裡。這樣,操作員就可以逐個地將它們收集起來,其中第乙個位置穿孔的放在最上面,第二...

排序演算法 四 基數排序

本篇部落格介紹基於順序表的實現 lsd,msd 兩種方式 基本思路 看排序陣列中最大值的位數,比如說最大值是999,就是三位 k1k2k3,先按k3掃瞄一遍陣列,分別記下k3位為0的個數,為1的個數,為9的個數,用陣列coun 10 來記錄,再使用乙個陣列addr 10 來記錄每個桶的起始位置 舉個...

Java實現 高效排序演算法之基數排序

1 基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。2 演算法的偽 和排序方法如下所示 其中方法是實現對整數的排序方式 基數排序的偽 radixsort for d 1 to 最長數字的最左邊數字所在的位置 根據第d位數字將所有的數字分別分配到堆0至堆9中 將所有證書放進乙個陣列中...