为啥我的计数排序算法根本不排序?

Posted

技术标签:

【中文标题】为啥我的计数排序算法根本不排序?【英文标题】:Why does my counting sort algorithm not sort at all?为什么我的计数排序算法根本不排序? 【发布时间】:2020-03-18 20:30:55 【问题描述】:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void SortCount(vector<int>& vec)
    int max_el = *max_element(vec.begin(), vec.end());

    vector<int> C(max_el+1, 0);
    vector<int> B(vec.size(), 0);

    for(int i = 0; i < vec.size(); i++)
        C[vec[i]] = C[vec[i]] + 1;
    
    for(int i = 1; i <= vec.size(); i++)
        C[i] = C[i] + C[i - 1];
    
    for(int i = 0; i < vec.size(); i++ ) 
        B[C[vec[i]] - 1] = vec[i];
        C[vec[i]] = C[vec[i]] - 1;
    
    for(int i=0; i<vec.size(); i++)
        vec[i] = B[i];
    


int main() 

    vector<int> vec 5,2,43,31,67,311;
    SortCount(vec);

    for (size_t i=0;  i <vec.size();  i++) 
        cout<<vec[i]<<" ";
    

    return 0;



我完全按照书上的规定做了,但由于某种原因,它只是按照放置它们的顺序打印出值。我在哪里搞砸了?

编辑:我添加了主函数

【问题讨论】:

您找到了max_el,但从不在任何地方使用它。也许这是个问题? 我没有在您的代码中看到 anywhere 实际更改(甚至分配任何内容)给定 vec 参数的任何元素!您只是在更改(可能)本地副本中的内容。 ***.com/q/1452721/430766 不是,这就是为什么它不是答案,而是评论。您似乎正在学习 C++,因此该链接可能对您很有价值。 某人发布该链接的目的是试图敦促您在未来伤害您之前打破这种不良做法。不,这不会导致问题。 【参考方案1】:

您对计数数组的迭代有错误的界限:

//for(int i = 1; i <= vec.size(); i++)  <--wrong
for(int i = 1; i < C.size(); i++) 
    C[i] = C[i] + C[i - 1];


您还应该养成使用std::size_t 作为索引类型而不是int 的习惯。 int 既小又带符号,不适合索引。

【讨论】:

以上是关于为啥我的计数排序算法根本不排序?的主要内容,如果未能解决你的问题,请参考以下文章

计数排序算法是如何计数的?

算法给小码农计数排序尊者

[排序算法总结三] 计数排序和桶排序

算法导论第八章__实现计数排序

排序算法的c++实现——计数排序

排序算法计数排序