计数排序

来源:互联网 发布:淘宝店标在线制作免费 编辑:程序博客网 时间:2024/06/04 18:40

1、计数排序

计数排序是一种线性排序算法,不用比较元素的大小。待排序序列中元素都是整数,且在0~k之间,k为整数。
稳定性强,时间复杂度为O(n+k),n为输入元素个数,k为待排序列中最大的数。
局限性大,只限于对整数进行排序。
通过消耗空间复杂度来获取快捷的排序,空间复杂度为O(k)。

2、基本思想

统计待排序列中小于等于每一个元素x的个数,并把结果记录到辅助数组C[0~k]中,从而确定x在排好序的数组中的位置,
           

数组A是待排序的数组,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个。以此类推。

得到A和C之后,就可以开始排序了。如A[8]=3,我们由C数组知道,小于等于3的元素有7个,所以排好序的数组中,3应该放在数组的第7位,相应的3的个数应减1,即C[3]-1=7-1=6;A[7]=0,由C知道C[0]=2,故0应该放在第2位,相应的0的个数减1,即C[0]-1=2-1=1;以此类推这样排下去……


代码:

#include <iostream>#include <vector>using namespace std;void COUNTINGSORT(int *A,int *B,int len,int k){    if(A == NULL || k <= 0 || len <= 0)        return;    int C[k+1],i;    //初始化辅助数组    for(i = 0;i <= k;i++)        C[i] = 0;    //统计值为A[i]的个数,C[i]是等于i的元素个数    for(i = 0;i < len;i++){        C[A[i]] ++;    }    //确定值A[i]在最终输出数组B中位置,C[i]是小于等于i的元素个数    for(i = 1;i <= k;i++)        C[i] += C[i-1];    //输出到数组B中    for(i = len-1;i >= 0;i--){        //index元素A[i]在数组B中的下标        int index = C[A[i]];        B[index-1] = A[i];        //如果有相同值元素的情况        C[A[i]] --;    }    //B下标从0开始}int main(){    int A[8] = {2,5,3,0,2,3,0,3};    int B[8];    COUNTINGSORT(A,B,8,5);    for(int i = 0;i < 8;i++){        cout<<B[i]<<' ';    }    return 0;}


原创粉丝点击