堆排序-使用哪个堆(最小/最大)进行升序排序和降序排序
heap sort - which heap (min/max) to use for ascending and descending order sort?
我注意到一件非常奇怪的事情。
在完成这个讲座之后,我在c++中实现了堆排序的一些代码。
代码如下。
template<typename T> void min_heapify(std::vector<T> &vec, int i, int size)
{
int left = (2*i); //left child of a zero-indexed heap (array)
int right = (2*i)+1; //right child.
int min;
min = ( (left<size) && (vec[left] < vec[i]) ) ? left : i;
min = ( (right<size) && (vec[right] < vec[min]) ) ? right : min;
if (min!= i)
{
swapper(vec[i],vec[min]);
min_heapify(vec, min, size);
}
}
template<typename T> void build_min_heap(std::vector<T> &vec, int size)
{
int i = size/2;
while(i--)
{
min_heapify(vec, i, size);
}
}
template<typename T> void heap_sort(std::vector<T> &vec, int size)
{
// build min heap
build_min_heap(vec, size);
// then extract min repeatedly.
while(size>0)
{
size--;
swapper(vec[0],vec[size]);
min_heapify(vec,0,size);
}
}
int main()
{
vector<int> v{14,-1,1000, -999, 3,2,5,10};
heap_sort(v, v.size());
return 0;
}
奇怪的是,对我来说是有意义的-建立最小堆-提取最小值(或在构建最小堆后在根执行最小堆积)结果应该是升序。然而,在执行这段代码并打印出结果向量之后,我得到:
1000 14 10 5 3 2 -1 -999
试图弄清楚发生了什么,我改变了
min = ( (left<size) && (vec[left] < vec[i]) ) ? left : i;
min = ( (right<size) && (vec[right] < vec[min]) ) ? right : min;
min = ( (left<size) && (vec[left] > vec[i]) ) ? left : i;
min = ( (right<size) && (vec[right] > vec[min]) ) ? right : min;
,它实际上最终选择父节点和子节点中较大的(或最大值),结果向量是:
-999 -1 2 3 5 10 14 1000
是我做错了什么,还是我对堆/堆排序的理解不清楚?我遗漏了什么?
是的,swapper(vec[0],vec[size]);
是提取。将第一个元素提取到向量的最后一个元素中。因此得到了相反的结果。
堆的最小元素是vec[0]
。将其交换到最后一个位置将在该向量中创建一个从最大值到最小值的排序。
如果你实现像
这样的东西result.push_back(heap.pop_min());
相关文章:
- 修改的选择排序,选择最大的数字,然后交换到最后
- 选择排序以查找未排序数组中的最大数字
- 如何修复错误:使用向量查找最小值和最大值进行合并排序
- 如何使用气泡排序从最小到最大对 4 个数组进行排序? C++
- 计数排序(从最大值到最小值)
- 五个中三个最大参数的平均值,不使用排序算法或向量/数组
- 用于快速排序的最大元素交换次数
- 在数组C 中排序最大和最小的值
- C 气泡排序:最大数字变为随机
- 如何查找给定矩阵的最大排序子矩阵(按行和按列排序)
- 选择从两端以最小值和最大值排序
- 如果连接了换成气泡排序的元素,请找到所有非连接元素的最大子集
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 使用向量而不是数组从最小到最大对数字进行排序C++
- 在 c++ 中给出两个整数向量(大小和类型相同),我想从最小到最大元素对一个进行排序,并更改第二个向量的顺序
- 根据中心点从最小到最大对QGraphicsItems QList进行排序
- 试图从最小值到最大值对C++的3个值进行排序
- 基于最大公分的排序顺序
- 如何查找排序列表的最小值、最大值、总和和平均值
- 如何在数组中按变量(int-最小到最大)对数组进行排序