关闭

计数排序的理解和代码实现

标签: 计数排序算法导论c语言
164人阅读 评论(0) 收藏 举报
分类:

由决策树模型可知,比较排序最坏情况的下届要比较nlgn次,不是线性排序的。所以,在算法导论中提出了几种线性排序,其中计数排序就是一种。下面总结一下计数排序的原理:

假设n个输入元素中的每一个元素都是在[0,..,k]内的整数。设输入数组为A[n];输出数组为B[n];临时存储数组为C[k]。算法如下:

1.把C[k]中的元素全部置0。

2.统计A中含有元素i的个数(i={0,...,k-1}),并存储在C[i]中。

3.统计A中小于等于i的元素的个数(i={0,...,k-1}),并存储在C[i]中。

4.从n-1开始,把A中等于i的元素存储的B中指定的位置,B就是一个排好序的输出。因为在2和3中,我们已经知道小于等于i的元素的个数,所以,这里只需要在B[C[i]]处存储i就行,并把C[i]减1,重复此过程,直到把A中元素全部存储到B中。

C语言实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


void countSort(int A[],int B[],int n,int k)
{
    int i,*C;
    C=malloc(k*sizeof(int));
    for(i=0;i<k;i++)
        C[i]=0;


    for(i=0;i<n;i++)
        C[A[i]]++;     //计算数组A中有多少个A[i],并把A[i]个数值存放在C[A[i]]中。


    for(i=1;i<k;i++)
        C[i]+=C[i-1];  //计算A中有多少小于等于A[i],并存放在C[A[i]]中。


    for(i=n;i>0;i--)
        B[--C[A[i-1]]]=A[i-1];  //把A[i-1]的值存放在B[--C[A[i-1]]]中。
    free(C);
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2068次
    • 积分:98
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档