目录
高等排序3—计数排序
计数排序能在线性时间O(n+k)内对包含n个元素的数组进行排序,其中数组元素均大于等于0并且小于等于k。
计数排序也成为桶排序或箱排序。
算法讲解
计数排序对数组a的个元素进行排序时,先将小于或等于元素的元素个数记录在数组b中,根据b中的值来确定在数组c中的位置,最后输出数组c。
示例:
for (int i = 0; i < n; i++) {
b[i] = 0;
}
for (int i = 0; i < n; i++) {
b[a[i]]++;
}
for (int i = 1; i < max; i++) {
b[i] += b[i - 1];
}
for (int i = n-1; i >=0; i--) {
c[b[a[i]]] = a[i];
b[a[i]]--;
}
例题
输入n个整数,按升序排列输出。
#include<stdio.h>
#define max 999
int a[max],b[max], c[max];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
b[i] = 0;
}
for (int i = 0; i < n; i++) {
b[a[i]]++;
}
for (int i = 1; i < max; i++) {
b[i] += b[i - 1];
}
for (int i = n-1; i >=0; i--) {
c[b[a[i]]] = a[i];
b[a[i]]--;
}
for (int i = 1; i <= n; i++) {
printf("%d ", c[i]);
}
return 0;
}
从数组a的末尾开始选择,计数排序就是一种稳定的排序算法。
总结
计数排序法只能对非负数进行排序,并且所需时间和空间于数组a中元素的最大值成正比。
计数排序能在线性时间O(n+k)内实现排序,是一种高效而稳定的算法。
读《挑战程序设计竞赛》第十六天(侵删)2021.3.10
( 2021.7.10 第一次修改)