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

2021-07-22 20:03:03 字數 1711 閱讀 2278

今天,我來講一講基數排序。基數排序是一種用在老式穿卡機上的演算法。一張卡片有80列,每一列可以在12個位置中的任一處穿孔。排序器可以被機械地「程式化」,以便對一疊卡片中的每一列進行檢查,再根據穿孔的位置將它們放入12個盒子裡。這樣,操作員就可以逐個地將它們收集起來,其中第乙個位置穿孔的放在最上面,第二個其次,等等。對於十進位制數字來說,每列中只用到10個位置(另兩個位置用於編碼非數值字元)。乙個d位數占用d個列。因為卡片排序器一次只能檢視乙個列,因此,要對n張卡片上的d位數進行排序,就需要用到排序演算法。

從直覺上來看,人們可能會覺得應該按最高有效位進行排序,然後再對每個盒子中的數遞迴地排序,最後再把結果合併起來。不幸的是,為排序每乙個盒子中的數,10個盒子中的9個必須先放在一遍,這個過程產生了許多需要加以記錄的中間卡片堆。

與人們的直覺相反,基數排序是首先按最低有效位數字進行排序,以解決卡片排序問題。同樣,把各堆卡片收集成一疊,其中0號盒子中的在1號盒子中的前面,後者又在2號盒子中的前面,等等。然後,對整個一疊卡片按次低有效位排序,並把結果同樣地合併起來。重複這個過程,直到對所有的d位數字都進行了排序。所以,僅需要d遍就可以將一疊卡片排好序。

下圖說明了基數排序作用於「一疊」共7個3位數的過程。

這裡也有很重要的一點,就是基數排序的穩定性,所謂穩定性,是指當有多個相同元素的值時,排序後,他們的相對次序不變。參考計數排序

想想很好理解,因為操作員把卡片從盒子裡拿出來時不能改變它們的次序,否則不是亂套了嗎,即使數字相同,所屬者也可能是不同的。

基數排序要保持穩定,那在對每一位進行排序的時候就必須使用乙個穩定的演算法,這裡我們就可以使用計數排序作為這個子演算法。參考

計數排序

基數排序的**是很直觀的。

/**

* 基數排序

* @param a 需要排序的陣列,返回時已經排序

* @param d 最高位,最低位是1

* @return 結果陣列

*/public int radixsort(int a,int d)

return a;

}

拆分成計數排序後就很清楚了,然後把計數排序的方法稍微修改一下

/**

* 計數排序的變種,根據某一位進行排序,k不需要,因為每一位數字在0到9之間。

* @param a 原陣列

* @param b 結果陣列

* @param index 基於的位數

*/public void countingsort2(int a, int b, int index)

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

for (int i = a.length -1; i >= 0; i--)

}

要獲得數字的某位,當然直接寫個方法了

/**

* 獲得數字的某位

* @param digit 數字

* @param i 1-d位

* @return 單位數字

*/public int getdigit(int digit, int i)

return result;

}

上面有所有方法的單元測試:

如果有啥問題記得跟我說哈

原文:我略微修改了一下**和描述

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

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

Java實現基數排序

在眾多的排序方法中基數排序比較特殊,它是一種不需要進行關鍵字之間比較的排序方法,利用多關鍵字的劃分,逐漸將待排序列排好序。舉個例子 現在有陣列 278,109,63,930,589,184,505,269,8,83 第一次根據各位數將陣列劃分為10個佇列 當然其中的某些佇列可能不含有元素 0 930...

基數排序(java實現)

將所有待比較數值 正整數 統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。參考文章 點我 時間複雜度 基數排序中r為基數,d為位數。時間複雜度為o d n r 空間複雜度 對於任何位數上的基數進行 裝...