經典演算法 計數排序

2022-03-30 22:35:58 字數 2479 閱讀 2573

概述:計數排序是乙個非基於比較的排序演算法,該演算法於2023年由 harold h. seward 提出。它的優勢在於在對一定範圍內的集合排序時,它的複雜度為ο(n+k)(其中k是元素的範圍),快於任何比較排序演算法。

計數排序本質上是通過計算無序集合中元素出現的次數來決定集合應該如何排序的。

例如乙個陣列,進行計數排序過程

1、使用count陣列記錄元素次數

index:     0  1  2  3  4  5  6  7  8  9

count: 0 2 2 0 1 1 0 1 0 0

2、調整count陣列,統計元素在以排序陣列中的偏移

index:     0  1  2  3  4  5  6  7  8  9

count: 0 2 4 4 5 6 6 7 7 7

3、反向遍歷資料,根據元素的偏移把元素放置到以排序集合中,並減少一次計數。

比如最後乙個元素2,對應count中值count[2]是4,則在sorted中第4位置放乙個元素2。即sorted[count[2]-1] = 2;

index: 0 1 2 3 4 5 6 7 8 9
count: 0 2 4 4 5 6 6 7 7 7
sorted:- - - 2 - - - - - -
基本特性:

1、集合中元素可以轉換成整型索引值,且不會衝突。

2、轉換的索引值範圍已知且有限。

3、時間複雜度為o(n+k),不是基於比較的排序演算法,因此效率非常之高。

4、穩定性好

5、需要輔助空間,計數陣列和已排序陣列

如果索引值可以直接用元素值,並且不需要考慮相同值元素之間的先後,可以節省「以排序陣列」所用的空間,優化**參考後面

程式**:

#include #include 

using

namespace

std;

//元素值可以直接用作索引值,並行不考慮相同值元素先後關係

//這樣可以節省以排序資料的輔助空間

void countingsort2(int* data, int size, int

max)

int index = 0

;

for (int i=0; i)

}delete

counts;}//

計數排序

int convdatatoindex(float data, int

max)

template

void countingsort(t* data, int size, int

max, f conv)

for (int i = 1; ii)

for (int i = size-1; i >=0; --i )

memcpy(data, sorted, size * sizeof

(t));

delete

counts;

delete

sorted;}//

輔助函式

templatestatic

void showelem(t&val)

template

static

bool validate(t* data, int

len)

}return

true;}

//測試**

test(algo, tcountsort)

; countingsort(d4,

9, 105

, convdatatoindex);

for_each(d4, d4+9, showelem);

assert_true(validate(d4,

9));

cout

countingsort2(d1,

8, 9

); for_each(d1, d1+8, showelem);

assert_true(validate(d1,

8));

cout

countingsort2(d2,

1, 3

); for_each(d2, d2+1, showelem);

assert_true(validate(d2,

1));

cout

countingsort2(d3,

19, 112

); for_each(d3, d3+19, showelem);

assert_true(validate(d3,

19));

cout

<}

經典演算法 計數排序演算法

計數排序 該演算法於1954年由 harold h.seward 提出。它是乙個不需要比較的,類似於桶排序的線性時間排序演算法。該演算法是對已知數量範圍的陣列進行排序。其時間複雜度為o n 適用於小範圍集合的排序。計數排序是用來排序0到100之間的數字的最 好的演算法。比如100萬學生參加高考,我們...

經典演算法之計數排序

一 引言 計數排序假設 n個輸入元素中的每乙個都是介於 0 k的整數,此處 k為某個整數。當k等於o n 時,計數排序的執行時間為 n 二 基本思想 計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。例如 如果有 17個元素小於x,...

經典演算法之計數排序

一 引言 計數排序假設 n個輸入元素中的每乙個都是介於 0 k的整數,此處 k為某個整數。當k等於o n 時,計數排序的執行時間為 n 二 基本思想 計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。例如 如果有17個元素小於x,則...