• Count_sort C++


    简介:Wiki

    通俗地理解,例如有10个年龄不同的人,统计出有8个人的年龄比A小,那A的年龄就排在第9位,用这个方法可以得到其他每个人的位置,也就排好了序。当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去1。算法的步骤如下:

    1. 找出待排序的数组中最大和最小的元素
    2. 统计数组中每个值为{displaystyle i}i的元素出现的次数,存入数组{displaystyle C} C 的第{displaystyle i}i
    3. 对所有的计数累加(从{displaystyle C} C 中的第一个元素开始,每一项和前一项相加)
    4. 反向填充目标数组:将每个元素{displaystyle i}i放在新数组的第{displaystyle C[i]}{displaystyle C[i]}项,每放一个元素就将{displaystyle C[i]}{displaystyle C[i]}减去1

    计数

    加总

     

    //对每个A[i]值来说,C[A[i]]就是A[i]在输出数组中的最终正确位置(从1起)
    //因为有相等元素,所以C[A[i]]的值减1:所以具有稳定性
    //稳定性:对两个相同的数来说,在输入数组中先出现的数,在输出数组中也在前面

    这个图片更直观些

     c++ code

     1 #pragma once
     2 #include<vector>
     3 //当k = O(n)时,采用计数排序,运行时间theta(n)
     4 //theta(k)+theta(n)+theta(k)+theta(n)=theta(n)
     5 std::vector<int>
     6 Count_sort(const std::vector<int>& A, const int& k)
     7 {
     8     std::vector<int> c(k + 1);
     9     //计数:theta(k)
    10     for (int j = 0;j != A.size(); ++j)
    11         ++c[A[j]];
    12     //加总:theta(n)
    13     for (int i = 1;i <= k;++i)
    14         c[i] += c[i - 1];
    15     //布置:theta(k)
    16     std::vector<int> b(A.size());
    17     //:theta(n)
    18     for (int i = A.size()-1; i >= 0;--i)
    19         //对每个A[i]值来说,C[A[i]]就是A[i]在输出数组中的最终正确位置(从1起)
    20         //因为有相等元素,所以C[A[i]]的值减1:所以具有稳定性
    21         //稳定性:对两个相同的数来说,在输入数组中先出现的数,在输出数组中也在前面
    22         b[--c[A[i]]] = A[i];
    23     return b;
    24 }

    main.cpp

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<iterator> //ostream_iterator
     4 #include"COUNTING_SORT.h"
     5 
     6 using namespace std;
     7 
     8 void print(const vector<int>& v)
     9 {
    10     ostream_iterator<int> out_iter(cout, " ");
    11     copy(v.cbegin(), v.cend(), out_iter);
    12     cout << endl;
    13 }
    14 void CountingSort()
    15 {
    16     vector<int> v = { 2,5,3,0,2,3,0,3 };
    17     print(v);
    18     print(Count_sort(v, *max_element(v.cbegin(), v.cend())));
    19 }
    20 int main()
    21 {
    22     CountingSort();
    23 }
  • 相关阅读:
    ME05 黑匣子思维
    F06 《生活中的投资学》摘要(完)
    ME03 关于运气要知道的几个真相
    ME02 做一个合格的父母To be good enough parent
    ME02 认知之2017罗胖跨年演讲
    F03 金融学第三定律 风险共担
    F05 敏锐的生活,让跟多公司给你免单
    ML04 Accord 调用实现机器算法的套路
    D02 TED Elon Mulsk The future we're building — and boring
    ML03 利用Accord 进行机器学习的第一个小例子
  • 原文地址:https://www.cnblogs.com/Z-s-c11/p/13837239.html
Copyright © 2020-2023  润新知