排序演算法 基數排序RadixSort

2021-08-21 13:08:45 字數 2319 閱讀 7429

/**

* 基數排序 基本思想:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。

* 然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。

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

* 由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數, 所以基數排序也不是只能使用於整數。 步驟:

* 1、將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。 2、從最低位開始,依次進行一次排序。

* 3、這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

* *@author administrator

* */

public

class

radixsort

/** 比如某次經過上面統計後結果為:[0, 2, 3, 3, 0, 0, 0, 0, 0, 0]則經過下面計算後 結果為: [0, 2,

* 5, 8, 8, 8, 8, 8, 8, 8]但實質上只有如下[0, 2, 5, 8, 0, 0, 0, 0, 0, 0]中

* 非零數才用到,因為其他位不存在,它們分別表示如下:2表示比較位為1的元素可以存放在索引為1、0的

* 位置,5表示比較位為2的元素可以存放在4、3、2三個(5-2=3)位置,8表示比較位為3的元素可以存放在

* 7、6、5三個(8-5=3)位置

*///獲得0-9各個位上有幾位數字。總共有幾個資料

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

/** 注:這裡只能從陣列後往前迴圈,因為排序時還需保持以前的已排序好的 順序,不應該打

* 亂原來已排好的序,如果從前往後處理,則會把原來在前面會擺到後面去,因為在處理某個

* 元素的位置時,位記數器是從大到到小(count[digit(arr[i], d)]--)的方式來處

* 理的,即先存放索引大的元素,再存放索引小的元素,所以需從最後乙個元素開始處理。

* 如有這樣的乙個序列[212,213,312],如果按照從第乙個元素開始迴圈的話,經過第一輪

* 後(個位)排序後,得到這樣乙個序列[312,212,213],第一次好像沒什麼問題,但問題會

* 從第二輪開始出現,第二輪排序後,會得到[213,212,312],這樣個位為3的元素本應該

* 放在最後,但經過第二輪後卻排在了前面了,所以出現了問題

*/for (int i = arr.length - 1; i >= 0; i--)

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

system.arraycopy(tmparray, 0, arr, 0, tmparray.length);}}

/*** 方法2 :利用二維陣列,第一維代表某一位上的值,第二維裡面封裝待排序陣列中的元素。

* 最後從0-9 ,取出二維陣列中的元素

* *@param arr

*/public

static

void

radixsort2(int arr) //d表示最大的數有多少位

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

order[i] = 0;//order歸零

}n *= 10;//取下一位餘數的階乘數

k = 0;//k歸零,使不影響下一次迴圈

m++;}}

/*** 獲取最大數的位數,方便比較

* *@param arr

*@return 最大數的位數

*/public

static

intgetmax(int arr)

}int numofdigit = 0;

while (max > 0)

return numofdigit;

}/**

* 返回第d位的個數

* *@param n

* 需要求的引數

*@param d

* 引數的第d位

*@return

*/public

static

intgetdigit(int n, int d)

return n/power%10;

}public

static

void

main(string args) ;

radixsort2(data);

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

}}

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...

排序演算法 基數排序

一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...

排序演算法 基數排序

基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...