码迷,mamicode.com
首页 > 编程语言 > 详细

计数排序

时间:2020-05-16 12:49:20      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:imp   bre   cpp   分配   display   --   webkit   排名   weight   

计数排序

排序思想: 对于数组 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?‘\n‘:‘ ‘);
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("排序后:\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;i<n;i++)
43        a[i]=rand()%7+1;
44    printArr(a,10);
45    countSort(a,10);
46    return 0;
47}

计数排序

标签:imp   bre   cpp   分配   display   --   webkit   排名   weight   

原文地址:https://www.cnblogs.com/HappyKnockOnCode/p/12899788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!