第七章 ALDS1_6_A:Counting Sort 计数排序

来源:互联网 发布:不用网络看小说 编辑:程序博客网 时间:2024/05/16 01:42

知识点

计数排序

  • 执行步骤
    • 首先将C数组下的每个元素A[i]的值累加起来,C[A[i]]++
    • 然后从前往后累加C数组,C[i] = C[i] + C[i-1],这样的累加过程实际上将数值为i的最大位置保存了,之后从最大位置往前填充数据。
    • 由于存在多个相同元素的情况,所以在输出A元素Ai前,先修正计数用的C[Ai]C[Ai]=C[Ai]1。修正过程实际上是往前移动,因为C数组累加过程已经保证存储数字i的位置不多也不少。
  • 性质
    • 时间复杂度是O(n+k) ,n是元素的个数,k是全部元素的最大值
    • 稳定排序

问题链接

ALDS1_6_A:Counting Sort

问题内容

对数列A进行排序并输出排序后的结果

思路

参照计数排序的思想去实现

代码

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxx = 2000001;const int maxnum = 10010;int A[maxx], B[maxx];int C[maxnum];int main() {    int n;    scanf("%d", &n);    //初始化C数组    for (int i = 0; i < maxnum; i++)        C[i] = 0;    for (int i = 0; i < n; i++) {        scanf("%d", &A[i + 1]);        //计数到C数组        C[A[i + 1]]++;    }    // 累加和    for (int i = 1; i < maxnum; i++)        C[i] += C[i - 1];    for (int j = 1; j <= n; j++) {        // 根据C[A[j]]确定A[j]存贮的下标,保存到B数组        B[C[A[j]]] = A[j];        // 存储下标往前移动        C[A[j]] --;    }    for (int i = 1; i <= n; i++)        printf("%d%c", B[i], i == n ? '\n' : ' ');    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 血淤型月经不调的症状 宫寒血淤该怎么调理 血麻逐淤胶囊 血淤的症状有哪些 淤血 吃什么可以补气虚 血清 血清铁蛋白 血清蛋白 血清素 血清是什么 血清胆固醇 见血清 血清胆红素 血清钾 血清铁 血清白蛋白 抗毒血清 血清价格 血清的作用 血清图片 什么是血清 血清检查 毒蛇血清 血清总胆固醇 血清甲状腺激素偏高 血清绒毛膜促性腺激素测定 血清高密度脂蛋白 血清胆红素偏高 血清丙氨酸氨基转移酶 血清人绒毛膜促性腺激素 血清总胆红素偏高 血清低密度脂蛋白胆固醇偏高 血清碱性磷酸酶偏低 血清尿酸偏高怎么回事 血清谷丙转氨酶偏高 血清蛋白偏低 血清总胆固醇偏高 血清泌乳素偏高代表什么 血清总胆红素 血清促甲状腺激素