/**
* 基數排序 基本思想:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。
* 然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。
* 基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。
* 由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數, 所以基數排序也不是只能使用於整數。 步驟:
* 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 首先將序列中的記錄按照最低位值的大小分配到各個桶中...