演算法筆記之 計數排序

2021-08-27 09:59:42 字數 1048 閱讀 5600

適合整數排序,以及數值較小的情況。

當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 θ(n+k)。計數排序不是比較排序,排序的速度快於任何比較排序演算法。

由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍(等於待排序陣列的最大值與最小值的差加上1),這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如:計數排序是用來排序0到100之間的數字的最好的演算法,但是它不適合按字母順序排序人名。但是,計數排序可以用在基數排序中的演算法來排序資料範圍很大的陣列。

演算法的步驟如下:

找出待排序的陣列中最大和最小的元素

統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項

對所有的計數累加(從c中的第乙個元素開始,每一項和前一項相加)

反向填充目標陣列:將每個元素i放在新陣列的第c(i)項,每放乙個元素就將c(i)減去1

#include #include #include #include //int arr = ;

void print_arr(int *arr, int n) else

} printf("\n");

}/**

* n為陣列的長度,max為待排序的數的範圍。

*/void count_sort(int * ini_arr, int * sorted_arr, int n, int max)

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

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

cnt_arr[j] += cnt_arr[j - 1]; //cnt_arr儲存下標. 對於重複元素有穩定性

for (int k = n - 1; k >= 0; k--)

free(cnt_arr); //釋放資源

}int main()

print_arr(arr, n);

count_sort(arr, dest_arr, n, 10);

print_arr(dest_arr, n);

return 0;

}

演算法之計數排序

核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 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整型字串來記錄每個元素...