计数排序

2021-01-20 20:14

阅读:692

计数排序

排序思想: 对于数组 a[ ] 排序 ,先用数组c[ a[ i ] ] 记录其中的值出现的次数,然后计算前缀和;得出的值的意义就是 对于c[ a[i] ] 的值就是 对于所有的 a[ i ] 最后一个 a[ i ] 在数组中有序的排名,所以借助 ans[ ] 数组记录下标c[a[i] ] 的值为 a[i] ,- - c[ a [ i ] ] 就是 对于所有a[i] ,a[ i ] 的倒数第二个位置。

 1/**计数排序 1~10以内的数*/
2#include
3#include
4#include
5void printArr(int a[],int n)
6
{
7    for(int i=0;i 8        printf("%d%c",a[i],i==n-1?‘\n‘:‘ ‘);
9}
10void countSort(int a[],int n)
11
{
12    int c[12];
13    for(int i=0;i11;i++)
14        c[i]=0;/**清空*/
15
16    for(int i=0;i17        c[a[i]]++;/**计数*/
18
19    for(int i=1;i20        c[i]+=c[i-1];/**前缀和*/
21
22    /**
23    有了前缀和后,数字最后一个a[j]的排名为c[a[j]]
24    所以访问每个数字时,只是把a[j]放到对应的名次上
25    因为可能有多个a[j],所以名次可以从最后一个向前分配
26    */

27    int ans[12];
28    for(int j=n-1;j>=0;j--)
29    {
30        ans[--c[a[j]]]=a[j];
31    }
32    printf("排序后:\n");
33    printArr(ans,10);
34}
35int main()
36
{
37    int a[12];
38    int n=10;
39    /*srand函数设定rand函数所用随机数演算法的种子值*/
40    //srand(time(NULL));
41    /*time(t) t==NULL 返回当前时间,若非空:返回当前时间的同时,将返回值赋予t 指向的内存空间*/
42    for(int i=0;i43        a[i]=rand()%7+1;
44    printArr(a,10);
45    countSort(a,10);
46    return 0;
47}


评论


亲,登录后才可以留言!