排序算法 - 計(jì)數(shù)排序

概念:


計(jì)數(shù)排序不是一個(gè)比較排序算法,該算法于1954年由 Harold H. Seward提出,通過計(jì)數(shù)將時(shí)間復(fù)雜度降到了O(N),利用數(shù)組下標(biāo)來缺的元素的正確位置


案例:


假設(shè)數(shù)組中有10個(gè)隨機(jī)數(shù),取值范圍0~10,要求用最快的速度把這20個(gè)證書從小到大進(jìn)行排序

考慮到這些整數(shù)只能夠在 0、1、2、3、4、5、6、7、8、9、10 這11個(gè)數(shù)中取值,取值范圍有限。所以,可以根據(jù)這有限的范圍,建立一個(gè)長(zhǎng)度為11的數(shù)組,數(shù)組下標(biāo)從0-10,元素初始值全為0

在這里插入圖片描述

假設(shè)10個(gè)隨機(jī)數(shù)整數(shù)值如下

9,3,5,4,9,1,2,7,8,1

第一次計(jì)數(shù)

在這里插入圖片描述

第二次計(jì)數(shù)

在這里插入圖片描述

第三次計(jì)數(shù)

在這里插入圖片描述

第四次計(jì)數(shù)

在這里插入圖片描述

第五次計(jì)數(shù)

在這里插入圖片描述

第六次計(jì)數(shù)

在這里插入圖片描述

第七次計(jì)數(shù)

在這里插入圖片描述

第八次計(jì)數(shù)

在這里插入圖片描述

第九次計(jì)數(shù)

在這里插入圖片描述

第十次計(jì)數(shù)

在這里插入圖片描述

最終,當(dāng)數(shù)列遍歷完畢時(shí),數(shù)組狀態(tài)如下

在這里插入圖片描述

該數(shù)組中每一個(gè)下標(biāo)位置的值代表數(shù)列中對(duì)應(yīng)整數(shù)出現(xiàn)的次數(shù)。

有了這個(gè)統(tǒng)計(jì)結(jié)果,排序就簡(jiǎn)單多了,直接便利數(shù)組,輸出數(shù)組元素的下標(biāo)值,元素的值時(shí)幾,就輸出幾次

1,1,2,3,4,5,7,8,9,9

顯然,現(xiàn)在輸出的數(shù)列已經(jīng)是有序的了。

這就是計(jì)數(shù)排序的基本過程,它適用于一定范圍內(nèi)的整數(shù)排序。在取值范圍不是很大的情況下,它的性能甚至快過那些時(shí)間復(fù)雜度為 O(nlogn) 的排序。


代碼實(shí)現(xiàn):


public class test {

    public static void main(String[] args) {
        int[] array = new int[] {4,4,6,5,3,2,8,1,7,10};
        int[] sortedArray = countSort(array);
        System.out.println(Arrays.toString(sortedArray));
    }

    public static int[] countSort(int[] array){
        //1. 得到數(shù)列最大值
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(array[i] > max){
                max = array[i];
            }
        }
        //2. 根據(jù)數(shù)列最大值確定統(tǒng)計(jì)數(shù)組的長(zhǎng)度
        int[] countArray = new int[max+1];
        for(int i=0; i<array.length; i++){
            countArray[array[i]]++;
        }
        //遍歷統(tǒng)計(jì)數(shù)組,輸出結(jié)果
        int index = 0;
        int[] sortedArray = new int[array.length];
        for(int i=0; i<countArray.length; i++){
            for(int j=0; j<countArray[i]; j++){
                sortedArray[index++] = i;
            }
        }
        return sortedArray;
    }

}

[1, 2, 3, 4, 4, 5, 6, 7, 8, 10]

這段代碼在開頭有一個(gè)步驟,就是求數(shù)列的最大整數(shù)值max。后面創(chuàng)建 的統(tǒng)計(jì)數(shù)組countArray,長(zhǎng)度是max+1,以此來保證數(shù)組的最后一個(gè)下 標(biāo)是max。


計(jì)數(shù)排序優(yōu)缺點(diǎn)


  1. 當(dāng)數(shù)列最大和最小值差距過大時(shí),并不適合用計(jì)數(shù)排序

例如給出20個(gè)隨機(jī)整數(shù),范圍在0到1億之間,這時(shí)如果使用計(jì)數(shù)排序,需要?jiǎng)?chuàng)建長(zhǎng)度為1億的數(shù)組,不但浪費(fèi)空間,而且時(shí)間復(fù)雜度也會(huì)隨之升高

  1. 當(dāng)數(shù)列元素不是整數(shù)時(shí),也不適合用計(jì)數(shù)排序

如果數(shù)列中的元素都是小數(shù),如25.213,或0.00 000 001 這樣的數(shù)字,則無法創(chuàng)建對(duì)應(yīng)統(tǒng)計(jì)數(shù)組,這樣顯然無法進(jìn)行計(jì)數(shù)排序。

對(duì)于這些局限性,另一種線性時(shí)間排序算法做出彌補(bǔ)、這周排序算法叫做桶排序




個(gè)人博客地址:http://blog.yanxiaolong.cn | <font color = "orange"> 『縱有疾風(fēng)起,人生不言棄』 </font>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 初始計(jì)數(shù)排序 摘自漫畫算法: 計(jì)數(shù)排序是一種不基于元素比較,利用數(shù)組索引來確定元素的正確位置的。 假設(shè)數(shù)組中有20...
    花逝97閱讀 560評(píng)論 0 1
  • 題外話計(jì)數(shù)排序時(shí)間性能比之前的排序算法高,在實(shí)際中應(yīng)用較多,只需要O(n)時(shí)間即可完成排序。計(jì)數(shù)排序思想比較巧妙,...
    哪有歲月靜好閱讀 346評(píng)論 0 0
  • 核心思想 計(jì)數(shù)排序不是基于比較的排序算法,算法的核心有3點(diǎn):統(tǒng)計(jì)原數(shù)組中每個(gè)元素出現(xiàn)的次數(shù)。以原數(shù)組中的元素為下標(biāo)...
    Alisallon閱讀 1,211評(píng)論 0 1
  • 前面說的那些排序算法,都是要通過比較來實(shí)現(xiàn)的。排序還能不通過比較來實(shí)現(xiàn)?是的,計(jì)數(shù)排序就是這么神奇。 一、排序思想...
    貪挽懶月閱讀 588評(píng)論 0 1
  • 計(jì)數(shù)排序 基本思想:不通過比較,計(jì)下每個(gè)元素的出現(xiàn)次數(shù),統(tǒng)計(jì)小于這個(gè)元素的個(gè)數(shù)N,將其放在N位。例如{7,6,2,...
    守敬閱讀 2,518評(píng)論 1 2

友情鏈接更多精彩內(nèi)容