排序 计数排序“概念”

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序 计数排序“概念”相关的知识,希望对你有一定的参考价值。

1. 应用场景

一是需要排序的元素必须是整数,二是排序元素的取值要在一定范围内,并且比较集中。

1.1 思想

step1. 统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项
step2. 累加元素出现次数(计算不超过 X包括X 的元素的个数)
step3. 反向填充目标数组:将元素X依次逐个放入到适当的位置

 void countSort(int arr[], int len)  
        //1.获得数列的最大值
        int max = arr[0];
        for (int i = 1; i < len; i++) 
            if (arr[i] > max)
                max = arr[i];
        

        //2.根据数列的最大值肯定统计数组的长度
        int* countArray = new int[max + 1];

        //3.遍历数列,填充统计数组
        for (int i = 0; i < len; i++)
            countArray[arr[i]]++;

        //4.遍历统计数组,输出结果
        int index = 0; 
        for (int i = 0; i < max + 1; i++) 
            while (countArray[i] > 0)  
                arr[index++] = i;
                countArray[i]--;
            
         
    

1.2 min优化

空间不一定需要max那么多个。计算max-min个即可。

    void countSort(int arr[], int len) 
        //1.获得数列的最大值和最小值
        int max = arr[0];
        for (int i = 1; i < len; i++) 
            if (arr[i] > max)
                max = arr[i];
         
        int min = arr[0];
        for (int i = 1; i < len; i++) 
            if (arr[i] < min)
                min = arr[i];
        

        //2.初始化计数数组count的长度
        int* countArray = new int[max - min + 1];

        //3.遍历数列,填充统计数组
        for (int i = 0; i < len; i++)
            countArray[arr[i] - min]++;// A中的元素要减去最小值,再作为新索引

        //4.遍历统计数组,输出结果
        int index = 0;
        for (int i = 0; i < max + 1; i++) 
            while (countArray[i] > 0) 
                arr[index++] = i + min;
                countArray[i]--;
            
        
     

【引用】

[1] 代码countSort.h

以上是关于排序 计数排序“概念”的主要内容,如果未能解决你的问题,请参考以下文章

可视化桶排序

排序算法——计数排序

计数排序算法是如何计数的?

计数排序是个啥?

在线性时间内对 0 到 n^2 – 1 范围内的 n 个数字进行排序

计数排序,桶排序,基数排序的python实现