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

流过昼夜 提交于 2019-11-30 01:37:59

计数排序学习笔记

时间复杂度为Θ(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]] --;
    }

}





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!