計數排序
阿新 • • 發佈:2020-08-09
計數排序
有這樣一道排序題:數組裡有20個隨機數,取值範圍為從0到10,要求用最快的速度把這20個整數從小到大進行排序。
這種排序演算法不是基於元素比較,而是利用陣列下標來確定元素的正確位置。
在剛才的題目裡,隨即整數的取值範圍是從0到10,那麼這些整數的值肯定是在0到10這11個數裡面。於是我們可以建立一個長度為11的陣列,陣列下標從0到10,元素初始值全為0,如下所示:
先假設20個隨機整數的值是:9, 3, 5, 4, 9, 1, 2, 7, 8,1,3, 6, 5, 3, 4, 0, 10, 9, 7, 9
讓我們先遍歷這個無序的隨機陣列,每一個整數按照其值對號入座,對應陣列下標的元素進行加1操作。
比如第一個整數是9,那麼陣列下標為9的元素加1:
第二個整數是3,那麼陣列下標為3的元素加1:
繼續遍歷數列並修改陣列......
最終,數列遍歷完畢時,陣列的狀態如下:
陣列中的每一個值,代表了數列中對應整數的出現次數。
有了這個統計結果,排序就很簡單了,直接遍歷陣列,輸出陣列元素的下標值,元素的值是幾,就輸出幾次:
0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 9, 9, 10
、
public static int[] countSort(int[] array) { //1.得到數列的最大值 int max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max) max = array[i]; } //2.根據數列的最大值確定統計陣列的長度 int[] coutArray = new int[max + 1]; //3.遍歷數列,填充統計陣列 for(int i = 0; i < array.length; i++) coutArray[array[i]]++; //4.遍歷統計陣列,輸出結果 int index = 0; int[] sortedArray = newint[array.length]; for (int i = 0; i < coutArray.length; i++) { for (int j = 0; j < coutArray[i]; j++) { sortedArray[index++] = i; } } return sortedArray; }