计数排序
#include<stdio.h>
int maxval(int* nums,int n) {//找最大值
int max = nums[0];//默认最大值
for (int i = 0; i < n;i++) {
if (max < nums[i]) {
max = nums[i];
}
}
return max;
}
void bucketsort(int *nums,int n) {
int max = maxval(nums, n);
//申请桶
int* buck = (int*)malloc((max + 1), sizeof(int));
//用桶计数,记录原数组当中每个元素出现的次数
for (int i = 0; i < n ; i++) {
buck[nums[i]]++;
}
int index = 0;//记录数据放置原数组什么位置
for (int i = 0; i <= max; i++) {
while (buck[i]--) {
nums[index++] = i;
}
}
}
int main() {
int nums[] = { 5,4,2,1,6,3,8 };
int n = sizeof(nums) / sizeof(int);
bucketsort(nums, n);
for (int i = 0; i < n; i++) {
printf("%d", nums[i]);
}
return 0;
}
时间复杂度分析:
O(n)
稳定性:
稳定,计数排序不是基于数据之间的比较来实现的,而是利用数组的下标来实现排序的