【算法】——排序:计数排序

计数排序的核心思想就是将需要排序的数组的元素转为下标,在辅助空间数组(辅助空间数组的初始都是0)中找到对应元素的下标位置,将该位置的元素++,扫描下标,将对应不为0的下标记录赋值给原数组,然后对应下标元素--

图例分析:

具体代码:

#include<stdio.h>
void countSort(int *A,int len);
int maxA(int *A,int len);
int main()
{
    int i;
    int j=0;
    int A[1000];
    char ch;
    int len;
    //实现输入未知数个整形数组的同时记录数组的长度 
    do{
        scanf("%d",&A[j]);
        j++;
        len=j;
    }while((ch=getchar()!='\n'));
    countSort(A,len);//调用计数排序
    for(i=0; i<len; i++)
    {
        printf("%d ",A[i]);
    }
    return 0;
}
void countSort(int *A,int len)
{
    int i,j;
    int k=0;
    //获取到数组A中的最大的元素的值
    int n=maxA(A,len);
    //创建辅助空间help[]数组,数组大小时max+1,原始都是0
    int help[n+1]={0};
    //循环遍历(在A中遍历)将A的元素对应给help的下标位置++,help[A[i]++] 
    for(i=0; i<len; i++)
    {
        help[A[i]]++;
    }
    //扫描辅助数组help,如果对应的值不为0的情况下,就将下标赋值给原本的数组 
    for(j=0; j<n+1; j++)
    {
        while(help[j]!=0)//注意应该是while,而不是if,一直循环到当前位置为0,在移动到下一位
        {
            A[k]=j;//按顺序将循环时对应的值不为0的下标赋值给原数组A
            k++;//赋值之后原本的数组A移动位置
            help[j]--;//对应的数值也需要减一 
        }
        //如果help[j]是等于0的情况就说明原本的数组没有这个元素,直接可以不管 
     } 
     
}

//找出数组中的最大值
int maxA(int *A,int len)
{
    int i;
    int max=A[0];
    for(i=0; i<len; i++)
    {
        if(A[i]>max)
        {
            max=A[i];
        }
    }
    return max;
 } 

 

结果演示:

方法总结:时间效率高,速度快,但是当数的范围很大的时候回导致辅助空间也很大,不过在1000以内还是可以忍受的。

posted @ 2020-02-26 12:56  美好事物  阅读(132)  评论(0编辑  收藏  举报