计数排序

Posted happyknockoncode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序相关的知识,希望对你有一定的参考价值。

计数排序

排序思想: 对于数组 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<stdio.h>
3#include<time.h>
4#include<stdlib.h>
5void printArr(int a[],int n)
6
{
7    for(int i=0;i<n;i++)
8        printf("%d%c",a[i],i==n-1?‘ ‘:‘ ‘);
9}
10void countSort(int a[],int n)
11
{
12    int c[12];
13    for(int i=0;i<=11;i++)
14        c[i]=0;/**清空*/
15
16    for(int i=0;i<n;i++)
17        c[a[i]]++;/**计数*/
18
19    for(int i=1;i<=n;i++)
20        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("排序后: ");
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;i<n;i++)
43        a[i]=rand()%7+1;
44    printArr(a,10);
45    countSort(a,10);
46    return 0;
47}

以上是关于计数排序的主要内容,如果未能解决你的问题,请参考以下文章

算法-java代码实现计数排序

计数排序代码

计数排序Java代码实现

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

计数排序再思考——从2020年1月第16题谈起

计数排序就是这么容易