基數排序或者說是桶排序
阿新 • • 發佈:2020-07-18
基數排序的基本思路
521 123 496 333 224
假設有這幾個數
排序的基本過程是
先獲取這五個數各位上的數,根據數對號入桶(所以需要十個桶子,0~9的下標分別對應這是存放數字幾的桶子)
第一次:
521入一號桶 123入三號桶 496入6號桶 333入三號桶 224入4號桶
再分別將0~9號桶中的資料取出 521 333 123 496 224
第二次:十位入桶
521 123 224 333 496 ———》 224 123 521 333 496
第三次:百位入桶
123 224 333 496 521 ———》 123 224 333 496 521
public static void radixSort(int [] array){ //根據每一遍的結果可以知道,要先獲得最大數的長度 int max = 0; for (int i = 0; i < array.length; i++) { if (array[max] < array[i]){ max = i; } } int maxLength = (array[max] + "").length();//用一個二維陣列來當桶子存放資料,行從上到下存放資料,列就表示各個位的數對對應桶子 //各個位的數字的範圍是0~10 ,每個桶子最多存放array.length個數據 int [] [] temp = new int[10][array.length]; //先從第一輪排序的情況分析 //count用來記錄每個桶子中存放的資料的個數,count[0]對應的數字就是桶子0中的元素個數... int [] count = new int [10]; //遍歷陣列,根據個位資訊對號入桶 int n = 0;int k = 1; while (n < maxLength){ for (int value : array) { int number = value / k % 10; temp[number][count[number]] = value; count[number]++; } //全部對號入桶之後再將入桶的資料全部取出 int index = 0; for (int i = 0; i < 10; i++) { if (count[i] != 0){ for (int j = 0; j < count[i]; j++) { array[index++] = temp[i][j]; } count[i] = 0; } } k *= 10; n ++; } }