演算法導論之八計數排序

2021-06-25 08:55:08 字數 1399 閱讀 8449

1.        定理1:在最壞情況下,任何比較排序演算法都需要做

定理2:堆排序和歸併排序都是漸近最優的比較排序演算法。

2.        計數排序的思想是:對每乙個輸入元素x,確定小於x的個數,前提條件時假設n個輸入元素中的每乙個都是在0到k區間內的乙個整數。

3.        計數排序演算法的輸入是陣列a[1..n],alength=n,陣列b[1..n]存放排序的輸出,c[0..k]提供臨時儲存空間

count-sort(a,b,k)

//初始化操作

let c[0..k]be a new array

for i = 0 tok

c[i]= 0

//c[i]中儲存的是等於i的元素的個數

for j = 1 toa.length

c[a[j]]= c[a[j]] + 1

//通過相加,確定對每乙個i=0,…,k,有多少輸入元素是小於等於i的

for i = 1 tok

c[i]= c[i] + c[i-1]

for j =a.length downto 1

b[c[a[j]]]= a[j]

c[a[j]]= c[a[j]] – 1

最後將每個元素a[j]放到它在輸出陣列b中的正確位置。如果n個元素互異,對每乙個a[j]值來說,c[a[j]]就是a[j]在輸出陣列中的最終正確位置,因為所有的元素可能並不互異,所以每將乙個值a[j]放入陣列b中以後,都要講c[a[j]]的值減1.這樣當下乙個值等於a[j]的輸入元素時,該元素可直接放到輸出陣列a[j]的前乙個位置上。

4.        當k為o(n)時,計數排序的執行時間為 ,計數排序的重要性質就是它是穩定的,即具有相同值得元素在輸出陣列中的相對次序與它們在輸入陣列中的相對次序相同。

5.        計數排序的程式**如下:

#include

#include

intcountsort(int *pdata,int nlen)

//統計陣列中相同元素的個數

for (int i=0;i

//確定不比該位置大的資料個數

for (int i=1;i

int *psort=null;     //儲存排序結果的指標

psort=(int *)malloc(sizeof(int)*nlen);

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

for (int i=0;i

free(pcount);

free(psort);

return 1; }

intmain() ;

countsort(ndata,10);

for (int i=0;i<10;i++)

printf("\n");

return 0; }

演算法導論 計數排序

不管所堆排序,還是快速排序,排序的本質都所基於各個元素之間的比較。而可以證明的是,所有基於比較的排序演算法,在最壞情況下的時間複雜度的下界是o nlgn 而,計數排序不所基於元素之間的比較,而是,對於乙個輸入x,在整個輸入中確定出小於x的元素個數,這樣就可以把元素x直接放在它在最終輸出陣列中的確定位...

演算法導論 計數排序

計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。計數排序的基本思想就是對每乙個輸入元素x,確定出小於x的元素個數。有了這一資訊,就可以把x直接放到它在最終輸出陣列中的位置上。例如,如果有17個元素小於x,則x就屬於第18個輸出位置。當有幾個元素相同時,這個方案要略作修改...

基本排序演算法 之八 計數排序

前面介紹的七種排序演算法都屬於 基於比較的排序演算法 cba式演算法 這類演算法的共同點就是 時間複雜度最優只能到o nlogn 接下來包括這次介紹的三種演算法都屬於非比較演算法,其時間複雜度平均情況下均為o k n k為常數。計數排序又叫鴿巢排序。就是用乙個與 數列最大數數值 相等長度 的陣列記錄...