對資料結構和演算法的總結和思考(六)--計數排序

lcc發表於2021-09-09

計數排序是我所知排序裡面速度最快得排序方式(元素分佈均勻),也是所學裡面第一種不需要比較的排序方式。那麼現在問題來了,既然這個排序方式這麼棒,但是為什麼有很多小夥伴都沒有聽說過~這就不得不提這個排序演算法的缺陷了,它只支援整數排序,是不是很尷尬,是不是很難受~,下面我就來分享下這個排序演算法。

核心思想:
計數排序的基本思想是對於給定的輸入序列中的每一個元素x,確定該序列中值小於x的元素的個數(此處並非比較各元素的大小,而是透過對元素值的計數和計數值的累加來確定)。一旦有了這個資訊,就可以將x直接存放到最終的輸出序列的正確位置上。例如,如果輸入序列中只有17個元素的值小於x的值,則x可以直接存放在輸出序列的第18個位置上。當然,如果有多個元素具有相同的值時,我們不能將這些元素放在輸出序列的同一個位置上,因此,上述方案還要作適當的修改,即如果元素相同,則同一個位置值加一。

具體實現如下:

// 計數排序法
function countingSort(array) {
    var len = array.length,
        B = [],
        C = [],
        min = max = array[0];
    console.time('計數排序耗時');
    //找出最大和最小值,並把元素放到新陣列中它的值所對應的位置上,入a[1] = 5 , 則C[5] = 1.如果該位置已經存在元素,那該位置值+1
    for (var i = 0; i = array[i] ? max : array[i];
        C[array[i]] = C[array[i]] ? C[array[i]] + 1 : 1;
    }

    //這一步是關鍵,計算每個位置前面有多少小於或等於它的元素。例如本來C為[, 1, 0, 1, 2] 那麼在C[1]前面有多少個比C[1]小的值,1個,在C[2]
    //前面有多少個比C[2]小的值,1 + 0 = 1個,在C[3]前有 1+0+1 = 2個,以此類推。
    for (var j = min; j 

計數排序主要就是把元素先放到一個新陣列中值對應的位置,就能知道自己前面有多少個比自己小的元素,然後一次遍歷放置就行。原理還是比較簡單,主要需要理解兩個地方,一個是計算自己前面有多少個元素,另一個就是把自己放在哪個位置。好了,排序演算法就分享完了,如有不懂,請留言,後續會講解查詢演算法和資料結構,thx~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2331/viewspace-2799334/,如需轉載,請註明出處,否則將追究法律責任。

相關文章