1. 程式人生 > 實用技巧 >計數排序

計數排序

計數排序

有這樣一道排序題:數組裡有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 = new
int[array.length]; for (int i = 0; i < coutArray.length; i++) { for (int j = 0; j < coutArray[i]; j++) { sortedArray[index++] = i; } } return sortedArray; }