十大基础排序 · 八 --- 计数排序

来源:互联网 发布:html数据库添加div 编辑:程序博客网 时间:2024/06/05 14:49


我也来写一篇排序的博客吧,看这个算法的有些博文推荐靠前但是写的有点乱,把自己的代码分享出来,让读者有更多的选择和思考;
虽然是个简单的小程序,若有更好的实现方法,欢迎交流探讨。

1. 简介

计数排序(CountSort)
时间复杂度: O(n) 空间复杂度:O(k)
适用场合: 数字在一定范围内,且分布密集或重复次数高;

分析:

1. 找到数组的最大最小值!(数字范围不一定是从 0~n,可能从 m~n)
2. 一个计数数组, 遍历一个带排数组,完成计数!
3. 通过计数数组中元素的值,得到每个元素的个数,放到待排数组中去!
4. 完成

例子:

原数组:4,4,5,6,5,5,6,6,5
MIn = 4, Max = 6;
pArrCount = {2,4,3} ==> 4+{0 0 1 1 1 1 2 2 2} => [4 4 5 5 5 5 6 6 6 ]

实现方法:3个for循环


2. 实现

void CountSort(int* arr, int nLength){    if(arr == NULL || nLength <= 0)    {        printf("CountSort :invalid input!\n");        return ;    }    int i;    //1. 找到数组的最大最小值    int Min = arr[0];    int Max = arr[0];    for(i =1; i<nLength; i++)    {        if(arr[i] < Min)             Min = arr[i];        if(arr[i] > Max)            Max = arr[i];    }    //2. 来一个计数数组, 遍历待排数组,完成计数!    int* pArrCount = (int*)malloc(sizeof(int)*(Max - Min + 1));    memset(pArrCount,0,(Max - Min +1)*sizeof(int));    for(i = 0; i< nLength; i++)    {        pArrCount[ arr[i]-Min ]++;    }    //3.通过计数数组中元素的值,得到每个元素的个数,放到待排数组中去!    int nIndex = 0;    for(i = 0; i< nLength; i++)    {        if(pArrCount[nIndex] > 0)        {            arr[i] = nIndex + Min;            pArrCount[nIndex]--;        }        else        {            nIndex++;            i--; //这次没进行赋值,但是一会i++就会跳过一位!        }    }    free(pArrCount);    pArrCount = NULL;}
原创粉丝点击