算法导论_计数排序学习笔记

本文详细介绍了一种线性时间复杂度的排序算法——计数排序,适用于已知元素范围的情况。文章通过实例演示了计数排序的过程,并解释了关键步骤:初始化计数数组、累积计数及逆向填充目标数组等,确保读者能够理解和实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计数排序学习笔记

时间复杂度为Θ(n)+Θ(k)=Θ(n+k);限制为需要知道待排序数组中元素的取值范围,以确定k值。


//注意下标,数组C[]的下标范围为0~k,包括k,因为要排序的数字的范围是0~k
//数组b的下标范围为1~n,包括n
//b的下标不能为0,如下标为0,则表示c[i]=0,而实际上c[i]=0时,对应的a中所有小于等于i的元素已经访问完

//c[i]最后表示a[n]中小于等于i的元素的总个数,b[c[a[i]]]=a[i]表示a[i]在数组b中的位置
//例如,a[5]=10表示数组a中第6个元素为10,c[10]=3,表示a中小于等于10的元素个数为3,
//      b[3]=a[5]=10表示10在b中的位置为3
//
#include <iostream>

using namespace std;
void CountSort(int a[],int b[],int n,int k);
int main()
{
    int n = 8;
    int k = 5;
    int a[] = {2,5,3,0,2,3,0,3};
    int b[n+1];

    cout << "a[n]:" << endl;
    for(int i=0 ; i<n ; i++){
        cout << a[i] << " ";
    }
    cout << endl;

    CountSort(a,b,n,k);

    cout << "b[n]:" << endl;
    for(int i=1 ; i<=n ; i++){
        cout << b[i] << " ";
    }
    cout << endl;

    return 0;
}
//input a[n],
//输入的n个数为0~k之间的整数
void CountSort(int a[],int b[],int n,int k)
{
    int c[k+1];
    for(int i=0 ; i<=k ; i++){
        c[i] = 0;
    }
    for(int i=0 ; i<n ; i++){//统计a[n]中取值为0,1...k的个数,c[i]表示a[n]中满足a[j]=i的个数
        c[a[i]] += 1;
        //int tempk = a[i];
        //c[tempk] +=1;
    }
    cout << "c[k]:" << endl;
    for(int i=0 ; i<=k ; i++){
        cout << c[i] << " ";
    }
    cout << endl;

    for(int i=1 ; i<=k ; i++){//c[i]表示a[n]中满足a[j]≤=i的个数
        c[i] += c[i-1];
    }

    cout << "c[k]:" << endl;
    for(int i=0 ; i<=k ; i++){
        cout << c[i] << " ";
    }
    cout << endl;
    for(int i=n-1 ; i>=0 ; i--){//note:从大到小遍历以保证稳定性
        b[c[a[i]]] = a[i];//
        c[a[i]] --;
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值