演算法分析之 計數排序

2021-07-11 02:38:52 字數 2420 閱讀 4960

計數排序不同於比較排序,是基於計數的方式,對於計數排序,假設每乙個輸入都是介於0~k之間的整數。對於每乙個輸入元素x,確定出小於x的元素的個數。假如有17個元素小於x,則x就屬於第18個輸出位置。

計數排序涉及到三個陣列a[0…length-1],length為陣列a的長度;陣列b與陣列a長度相等,存放最終排序的結果;c[0…k]存放a中每個元素的個數,k為陣列a中的最大值。

int count_k(int a,int length),此函式為了確定陣列a中最大的元素,用來確定c陣列的長度。

int count_k(int a,int length)

return max;

}

計數排序的實現:

void count_sort(int a,int b,int k)

free(c);

}

假如輸入的陣列為2,5,3,0,2,3,0,3

for(j=0;j<=length-1;j++)//計算a中元素的個數

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

表示陣列a中有2個0、0個1、2個2、3個3、0個4、1個5

for(i=1;i<=k;i++)//計算小於等於c[i]的元素的個數

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

小於等於0的數有兩個,小於等於1的數有兩個、小於等於2的數有4個、小於等於3的有7個、小於等於4的有7個、小於等於5的有8個

for迴圈分析如下

計數排序的最後執行截圖

計數排序分析:j=length-1;j>=0;j–此處為倒序,是為了保證排序的穩定性,這個在基數排序中有重要的作用。

演算法之計數排序

核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 o n k k為資料量 缺點 如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。public static int countsor...

演算法之計數排序

原理 用乙個陣列記錄待排序陣列 現的數字。最低位代表最小值,偏移量是記錄陣列中的下標 待排序陣列 2 1 4 可以表示為 記錄陣列 1 1 0 1 陣列長度為 4 1 1 然後根據記錄陣列輸出結果 public static void countsort int arr if arr.length ...

排序演算法之計數排序

今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...