非比較排序

2022-07-27 02:03:16 字數 1302 閱讀 3786

計數排序:n個輸入元素的每乙個都是在0到k之間的整數(k為某個整數)。

1.假設輸入陣列是a[1..n],還需要兩個陣列:b[1..n]存放排序的輸出,c[0..k]提供臨時儲存空間

2.c[i]中存放等於 i 的元素的個數,i=0,1,,k

3.通過相加計算確定有多少元素是小於等於i的

4.把每個元素a[i]放到陣列b正確的位置

#include #include 

using

namespace

std;

void countsort(vector &arr, int

maxval) }

intmain()

;

int maxval = 9

; countsort(arr,maxval);

for(auto x : arr)

cout

<< x << "";

cout

<

return0;

}

計數排序的公升級版:計數排序計算等於某個值的元素的個數,桶排序則是計算值在

某區間的元素的個數,每個桶就是乙個區間,分好後通過其他排序方法進行桶內排序。

當待排序元素取值範圍過大或者不是整數時,就不能使用計數排序,可使用桶排序。

和計數排序的比較

1.計數排序

計數排序需要根據原始數列的取值範圍,建立乙個統計陣列,用來統計原始數列中每乙個可能的整數值所出現的次數。

原始數列中的整數值,和統計陣列的下標是一一對應的,以數列的最小值作為偏移量。比如原始數列的最小值是90,

那麼整數95對應的統計陣列下標就是 95-90 = 5。

2.桶排序

每乙個桶(bucket)代表乙個區間範圍,裡面可以承載乙個或多個元素。桶排序的第一步,就是建立這些桶,確定每乙個桶的區間範圍:

具體建立多少個桶,如何確定桶的區間範圍,有很多不同的方式。

當待排序元素在某個區間內分布均勻時,桶排序效率很高,但如果分布很不均勻,桶排序意義不大。

基數排序是先按最低位進行排序,依次向高位排。

前提是對每一位的排序必須是穩定的,例如可以基於計數排序進行基數排序。

非比較排序

以下內容參考自 演算法導論 基於比較的排序演算法可以用一顆完全二叉樹 決策樹 來表示,節點表示每一次的比較過程,葉子節點表示最終的排序順序,葉子節點一共有n 個 n表示資料個數,一共有n 種排列方式 二叉樹的高度h就是比較的次數,由二叉樹的性質,葉子節點的個數不大於2 h,所以有 2 h n 2 h...

排序(二)非比較排序

七大排序那篇部落格講的排序都是比較排序,這篇部落格要寫的內容是不需要通過比較就可以排序。1.計數排序 解題思路 開闢一塊陣列,範圍為最大數減去最小數,用這個數減去最小值的差,對應的下標來統計,剛開始都初始化為0,如果有就把新開闢中的值 最後按順序遍歷新開闢的陣列,把值放到原陣列中,就可以打到排序的目...

非比較排序 計數排序

計數排序 count sort 是乙個非基於比較的排序演算法,該演算法於1954年由 harold h.seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為 n k 其中k是整數的範圍 快於任何比較排序演算法。計數排序的思想類似於雜湊表中的直接定址法,在給定的一組序列中,先找出該...