计数排序

适用于数组元素范围确定

数组中尽量有重复元素的情况

 

原理为申请一个辅助数组,里面存放当前数组中元素的计数。

遍历原数组,相同元素计数++

 

void CountSort(int* arr,int nlength)
{
    int max = 0;
    int min = 0;
    //找到最大值和最小值 
    for(int i=0;i<nlength;i++)
    {
        if(arr[i] > max)
            max = arr[i];
        if(arr[i] < min)
            min = arr[i];
    }
    //申请计数数组 
    int* ptemp = (int*)malloc(sizeof(int)*(max-min+1));
    memset(ptemp,0,sizeof(int)*(max-min+1));
    //遍历原数组,给计数数组赋值 
    for(int i=0;i<nlength;i++)
        ptemp[arr[i]-min]++;

    int j = 0;
    //遍历计数数组,重新排序原数组 
    for(int i=0;i<max-min+1;i++)
    {
        while(ptemp[i])
        {
            arr[j] = i+min; 
            j++;
            ptemp[i]--;
        }
    }

    free(ptemp);
    ptemp = NULL;
}

 

posted @ 2018-05-29 10:22  TheQi  阅读(159)  评论(0编辑  收藏  举报