数据结构(九)计数排序

1、算法流程

(1)求取待排序数组A的最大值max

(2)创建一个新的数组C[max+1],用于统计数组A中的每个元素a,小于等于a的个数。

(3)根据小于等于a的个数,来确定排序后,a在排序数组中的位置,进行位置填充;

2、代码实现

写代码需要注意事项:

(1)计数统计结束后,我们根据C[a]的大小填充元素a,每填充一次C[a]要减去1,这样是为了保证重复数据可以正常填充;

(2)填充如果是要稳定排序,那么需要使用反向填充的方案;

int * count_sort(int *data,int length)
{
    int max=data[0];
    for (int i = 1; i <length ; ++i) {
        if(max<data[i])
            max=data[i];
    }

    //统计每个数值计数
    int *count=new int[max+1]();
    for (int i = 0; i<length ; ++i) {
        count[data[i]]++;
    }

    //从左往右,统计小于data[i]的数值个数
    for (int i = 1; i <=max ; ++i) {
        count[i]+=count[i-1];
    }


    int *sort_data=new int[length]();
    for (int i = 0; i<length; ++i) {//不稳定排序,因为相等的数值,位置会调换,如果要实现稳定排序,那么就需要反向填充,用i--的方式循环
        sort_data[count[data[i]]-1]=data[i];//这边需要注意索引值等于:个数-1
        count[data[i]]--;//重复数据问题,每填充一次,索引值就要往前移位
    }

    delete[] count;


    return sort_data;
}


int test_sort() {


    int data[10]={5,1,6,7,8,4,2,2,10,13};
    //非比较排序算法

    int * sort_data=count_sort(data,10);
    for(int i=0;i<10;i++)
    {
        std::cout<<sort_data[i]<<std::endl;
    }
    delete[]sort_data;


    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值