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

    计数排序的算法思想:

    对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置。

    记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k]。

    1首先,将中间数组C[k]清0,其中,0~k为A[n]中元素的取值范围。

    2一边遍历A[n]一边将A[n]的元素值作为C[k]数组中的下标,C[A[n]]++;

    3从前到后遍历C[k],让c[i]=c[i-1]+c[i],这样就可以知道了每个待排元素有多少个比他们小的元素存在。

    4遍历A[n],以访问C[A[n]],按照C[A[n]]的值把元素放到B[n]数组去。由于有可能会有相同的元素,每次存放后C[A[n]]元素要减1,以便下一次再碰到相同的元素时放到前一个位置。

    具体实现代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[10]= {31,27,13,26,15,20,1,10,5,38}; //输入数组
     6     int b[10];//用来存放排序的输出
     7     int c[40];//中间数组,40表示待排序列中的每个元素都小于40
     8 
     9     for(int i=0; i<40; i++) c[i]=0; //将中间数组置0
    10     for(int i=0; i<10; i++) c[a[i]]++;
    11     for(int i=1; i<40; i++) c[i]=c[i]+c[i-1];//统计有多少输入元素小于i
    12 
    13     for(int j=9; j>=0; j--)
    14     {
    15         b[c[a[j]]-1]=a[j];
    16         c[a[j]]--;
    17     }
    18     for(int i=0; i<10; i++)
    19         cout<<b[i]<<" ";
    20     cout<<endl;
    21     return 0;
    22 }
  • 相关阅读:
    RM报表 实际打印的判断
    ehlib 如何用代码,选中checkbox呢?
    [CF632A]Grandma Laura and Apples
    [洛谷P3693]琪露诺的冰雪小屋
    [CF1065A]Vasya and Chocolate
    [UOJ #52]【UR #4】元旦激光炮
    [UOJ #48]【UR #3】核聚变反应强度
    [UOJ #51]【UR #4】元旦三侠的游戏
    [洛谷P1401]城市
    [洛谷P4722]【模板】最大流 加强版 / 预流推进
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/8573789.html
Copyright © 2011-2022 走看看