计数排序算法

Posted 囧囧日记

tags:

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

计数排序算法是对已知数量范围的数组进行排序。其时间复杂度为O(n),适用于小范围集合的排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现个数。


下面以示例来说明这个

算法:

假设要排序的数组为 A = {2,5,3,0,2,3,0,3}

C是用来临时存放信息的数组,B是最终排好序的数组

对于A中的每一个元素,我们将其元素作为C数组的下标。直白的说,如a图中,C[0]=2表示A中的元素为0的有两个,C[1]=0,表示A数组中没有值为1的元素,以此类推。所以C[i]中存放的是A中i的个数。b图是对数组前面的数字相加后的结果,如C[2]=4表示,A中小于等于2的元素有4个。以此类推。这个时候的这个C数组非常重要,在另一篇关于计数排序数组的应用美团笔试题中会用到。

得到A和C之后,就可以开始排序了。如A[3]=3,我们由C数组知道,小于等于3的元素有7个,所以排好序的数组中,3应该放在数组B的第7位,B[7] =3,如图c。比如A[4]=0,由C知道,数组A中小于等于0的元素有2个,因此B[2]=0.以此类推这样排下去……

【特别注意】由于数组中可能会有相等的元素,因此在排序后,要记得C中对应部分减1

void CountSort(int a[], int n)

{

int b[1000] = { 0 };//后面={0}是初始化所有元素为0的意思

int c[1000] = { 0 };

        int max = 0;

for (int i = 0; i < n; i++)

{

c[a[i]]++;

                max = a[i] > max ? max:a[i];

}


    //a数组中最大数组元素小于1000 

for (int i = 1; i <=max; i++)

{

c[i] = c[i] + c[i - 1];

}


for (int i = 0; i < n; i++)

{

b[c[a[i]]] = a[i];//注意下标

c[a[i]]--;

}


for (int i = 0; i < n; i++)

{

cout << b[i] << " ";

}

}

不过这个解法并不是最优的。因为空间复杂度还应该可以优化,其实c数组中已经保存了a数组的数据了,我们不需要再去申请一个b数组的空间。

代码如下:

void CountSort(int a[], int n)

{

int c[1000] = { 0 };

       int max = 0;

for (int i = 0; i < n; i++)
 {

c[a[i]]++;

                max = a[i] > max ? max:a[i];

   }

       int z = 0;

   for (int i = 0; i <= max; i++)

            {

                while (c[i]>0)

                {

                cout << i << " ";

                     c[i]--;

                }

            }

}


如果面试题,就是这样简单的套模板就好了,奈何套路那么多。


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

排序算法非比较排序:计数排序基数排序桶排序

算法 计数排序

算法计数排序桶排序和基数排序详解

十大经典排序算法总结(计数排序)

计数排序基数排序桶排序

算法渣-排序-计数排序