適合整數排序,以及數值較小的情況。
當輸入的元素是 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整型字串來記錄每個元素...