计数排序

很久之前我不知道计数排序的意义何在

算法导论中说,计数排序的基本思想就是对每一个输入元素x,确定小于x的元素个数。有了这一个信息,就可以把x直接放到它最终输出数组中的位置上。

我觉得既然计数排序中要根据原数组的最大值来定义 排序中要使用的临时数组,那还不如直接新建一个大小为最大值+1的temp数组,全部置0之后读入原数组,对temp的对应下标的值++,然后按值的次数来输出数字不是更快吗。

不过还是写了下备用

#include<stdio.h>
void printArray(int array[],int length)
{
    for(int i=1;i<=length;i++)
    {
        printf("%d ",array[i]);
    }
    printf("\n");
}
void countingSort(int nums[],int result[],int max,int length)                   //nums原数组,result为输出数组,max是原数组中最大的元素, 
{
    int temp[max+2];
    int count=1;
    for(int i=0;i<=max;i++)temp[i]=0;                                           //置空 
    for(int i=1;i<=length;i++)temp[nums[i]]++;                                    //记录每个数字出现的次数 
    //printf("Temp now is:");                                    
    //printArray(temp,max); 
    for(int i=1;i<=max;i++)temp[i]=temp[i]+temp[i-1];
    //printf("Temp now is:");                                    
    //printArray(temp,max); 
    for(int j=length;j>=1;j--)                                                  //倒装在result数组中 
    {
        result[temp[nums[j]]]=nums[j];
        temp[nums[j]]--;       
    }
    //printArray(result,length);
}

int main()
{
    printf("请输入要数组的大小,和输入数组元素,下面进行计数排序:"); 
    int n;
    scanf("%d",&n);
    int nums[100],result[100];
    int max=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&nums[i]);
        if(nums[i]>=max)max=nums[i];                                            //在输入的时候就开始记录数组中的最大值,才能确定临时数组的开辟空间 
    }
    countingSort(nums,result,max,n);
    printArray(result,n);
    return 0;
}

posted on 2012-11-22 16:31  Aquariuslt  阅读(176)  评论(0)    收藏  举报

导航