計數排序 C 實現

2021-08-09 14:12:16 字數 1285 閱讀 3697

一 演算法描述

插入排序、選擇排序、氣泡排序、歸併排序、堆排序以及快速排序都是比較排序演算法——各元素之間的次序依賴於他們之間的比較。在最壞情況下,任何比較排序演算法都需要做ω(nlgn)次比較。因此堆排序和歸併排序都是漸進最優的比較排序演算法。

計數排序不是一種比較排序演算法,二是基於運算來確定元素的排序順序,因此ω(nlgn)的時間複雜度下界不再適用於計數排序。

計數排序假設n個輸入元素中的每乙個都是在0到k的區間內的乙個整數,其中k為整數。對每個輸入元素x,確定小於x的元素個數,這樣就可以直接把x放到它在輸出陣列中的正確位置上。

二 演算法實現

1 用於整數陣列的公升序排序

注意到在**中有countingarray[0]--這一句**,這是因為c#中陣列的下標是從0開始的,因此需要將元素0的個數減1來計算所有元素的位置。

public static int countingsort(int array, int k)

countingarray[0]--;

for (int j = 1; j < k; j++)

for (int i = array.length - 1; i >= 0; i--)

return outputarray;

}

2 用於整數陣列的降序排序

public static int countingdessort(int array, int k)

countingarray[k - 1]--;

for (int j = k - 2; j > 0; j--)

for (int i = array.length - 1; i >= 0; i--)

return outputarray;

}

三 演算法分析

1 在計數排序演算法中,耗時的為3個for迴圈。在第乙個迴圈中通過遍歷陣列中所有元素,計算每一種整數在陣列中的個數,顯然時間複雜度是θ(n),第二個迴圈通過累加每一種數字元素的個數來計算元素在排好序的陣列中的位置下標,其時間複雜度為θ(k),第三個迴圈則迴圈陣列中的每乙個元素,將其放到輸出陣列的正確位置,其時間複雜度為θ(n)。因此,當k=o(n)時,計數排序演算法的時間複雜度為θ(n)。

2 計數排序演算法是穩定的,排序前後相同值的元素的相對位置不會改變。

3 計數排序不是原址排序演算法。在計算過程中需要分配乙個大小為k的陣列來計數,乙個大小為n的陣列作為輸出陣列。因此其空間複雜度是θ(n)。

演算法導論 c 實現計數排序

計數排序的基本思想為 對每乙個輸入的元素x,確定出小於x的元素的個數。有了這一資訊,那麼就可以把x直接放到相應的位置上。特點 1 需要臨時的儲存空間,如果排序資料範圍特別大時,空間開銷很大。2 適合於排序0 100以內的資料。3 排序的時間複雜度為o n include include const ...

計數排序簡單實現

嘮叨完乙個 開始寫計數排序這個簡單的線性排序演算法。原理很簡單,繼續wiki 之 當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的...

計數排序 java實現)

計數排序常用於純數字的排序,速度很快,也很實用 小資料採用計數排序,空間換時間 package sort 計數排序 常用於數字排序 用空間換時間策略 public class countintegersort int min findmin arr int max findmax arr int c...