对数组进行部分排序
Partially sorting an array
部分
排序可以使用std::p artial_sort完成。
部分分拣装置
5 7 4 2 8 6 1 9 0 3
对 3 个元素进行部分排序后
0 1 2 7 8 6 5 9 4 3
http://en.cppreference.com/w/cpp/algorithm/partial_sort。
但是,当某些元素已经排序时,这不是最好的。
是否有其他这样的函数可以这样做并利用部分排序的数组。
您可以使用流式中位数算法的改编来跟踪一组术语的k
最小项。您可以将std::priority_queue
用于最小和最大堆。
该算法的工作方式如下:
- 最大堆用于保存
k
最小的项 - 最小堆用于保存所有其他术语
- 对于要跟踪的每个术语,确定应将其添加到哪个堆,并将其添加到其中
- 如果最大堆的大小小于
k
则将其添加到其中,否则 - 如果该项小于最大堆的顶部,请将其添加到其中,否则
- 将术语添加到最小堆
- 如果最大堆的大小小于
- 如果最大堆的顶部有超过
k
个术语,请弹出顶部术语,并将其推入最小堆
如果您需要对术语进行排序,可以按降序将它们从最大堆中弹出,以相反的顺序将它们放在数组中,从而留下一个排序的数组。如果将容器传递给最大堆的构造函数,则可以复制容器并对其进行排序。
默认情况下,std::priority_queue
是最大堆。要使其成为最小堆,请修改一些模板参数。
typedef std::priority_queue<int> MaxHeap;
typedef std::priority_queue
<
int,
std::priority_queue<int>::container_type,
std::greater<int>
> MinHeap;
相关文章:
- 对对应于矩阵的行和列的对向量进行排序
- 如何按矩阵行的总和降序对矩阵进行排序 C++.
- 按行的总和对矩阵进行排序
- 对包含整数的文本文件进行排序时,必须逐行进行排序
- C++ 换行符上的合并排序错误中断
- 读取 C++ 中的 txt 数据,展开为行或列并排序
- 为什么排序的第一行是全部0
- 无法将数组传递给排序函数(需要对列进行排序,而不是对行进行排序)
- 如何根据第三个单词在文本文件中排序行
- 如何查找给定矩阵的最大排序子矩阵(按行和按列排序)
- 在C++中对命令行参数进行排序
- 按行主顺序对给定矩阵进行C++排序
- C++:对2D数组进行基于1行的排序
- 特征在不复制的情况下对行重新排序
- 对行进行排序,这是闭合形状的一部分
- 数组列表、行搜索和气泡排序.作业C++
- 按列进行排序后,如何从qtablewidget :: item(qt bug?)中获取正确的行
- 双重释放或损坏(如果重新排序行,则运行正常)
- 将具有排序行的2D数组合并为一个大的1D数组
- c++方法,按列中的元素对矩阵排序(与MATLAB中的排序行相同)