七大经典算法排序系列(四)

计数排序

#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)

稳定性:

稳定,计数排序不是基于数据之间的比较来实现的,而是利用数组的下标来实现排序的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值