zoukankan      html  css  js  c++  java
  • 计数排序

     1 //计数排序的思想是这样的,如果小于等于a的数字有n个,那么就把a放在第n+1个位置,从而达到排序的目的
     2 //关键是怎么统计小于等于a的数字有多少个,
     3 /*
     4 可以采用这样一个办法,将数组元素的值映射为下标,统计该下标出现了多少次,然后再统计比该下标小或者等的下标出现了多少次,
     5 从而就统计出了小于等于a的数字有多少个
     6 */
     7 
     8 //计数排序的时间复杂度为O(n), 但是缺点为数据有多大,数据就要开多大。
     9 #include <stdio.h>
    10 #include <string.h>
    11 const int N = 1000;
    12 int a[N],b[N];
    13 int c[1000000];
    14 
    15 
    16 void countingSort(int n, int m)
    17 {
    18     int i;
    19     for(i=0; i<=m; ++i) c[i] = 0;
    20     for(i=0; i<n; ++i) c[a[i]] ++;//将a[i] 映射为下标,统计该下标出现了多少次
    21     for(i=1; i<=m; ++i) c[i] += c[i-1];//统计比该小或者等的下标出现了多少次
    22     //for(i=n-1; i>=0; --i) //稳定
    23     for(i=0; i<n; ++i)//不稳定
    24     b[--c[a[i]]] = a[i];//c[]记录了小于等于a[i]的数字有多少个,直接将a[i]放在相应的位置上去
    25 }
    26 int main()
    27 {
    28     int n,m,i;
    29     scanf("%d",&n);
    30     m = -1;
    31     for(i=0; i<n; ++i)
    32     {
    33         scanf("%d",&a[i]);
    34         m = a[i] > m ? a[i] : m;
    35     }    
    36     countingSort(n, m);
    37     for(i=0; i<n; ++i)
    38         printf("%d ",b[i]);
    39     
    40     return 0;
    41 }
  • 相关阅读:
    ETF上线技术要素
    oracle修改用户的schema
    list
    交易系统分类OMS/EMS
    类的大小2
    webpack5教程
    vue配置stylelint教程
    提高国内访问 GitHub 的速度的 9 种方案
    git常见的操作
    img 图像底部留白的原因以及解决方法
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4079281.html
Copyright © 2011-2022 走看看