计数排序

不同于比较排序(插入排序、分治法合并排序,堆排序、快速排序),计数排序不需要进行数值的比较,但是处理过程中会占用较多的空间,不具有空间原址性。计数排序是稳定排序。

//计数排序,时间复杂度为O(n)
//输入中数组从1开始计数
//COUNTING_SORT中A[]为输入数组,B[]为输出数组,length为数组长度,k为输入数组中的最大值
#include <iostream>
#include <cstring>

const int N=1000;

using namespace std;

int search(int A[],int length)
{
    int max=A[1];
    for(int i=1;i<=length;i++)
    {
        max=(max>A[i]?max:A[i]);
    }
    return max;
}

void COUNTING_SORT(int A[],int B[],int length,int k)
{
    int TEMP[N];
    memset(TEMP,0,sizeof(TEMP));
    for(int i=1;i<=length;i++) TEMP[A[i]]++;
    for(int i=1;i<=k;i++) TEMP[i]=TEMP[i]+TEMP[i-1];
    for(int i=length;i>0;i--)    //为了使计数排序保持稳定性,若i从1到length的话,不能保持其稳定性
    {
        B[TEMP[A[i]]]=A[i];
        TEMP[A[i]]--;
    }
}

int main(int argc, char *argv[])
{
    int length;
    cin>>length;
    int A[N],B[N];
    for(int i=1;i<=length;i++) cin>>A[i];

    int max;
    max=search(A,length);

    COUNTING_SORT(A,B,length,max);

    for(int i=1;i<=length;i++) cout<<B[i]<<" ";
    cout<<endl;

    cout << "Hello World!" << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值