我正在编写一个使用堆排序对数组进行排序的函数。到目前为止,我有:
template <typename Item, typename SizeType>
void heap_sort(Item data[], SizeType size) {
vector<int> v(data,data+size);
SizeType unsorted = size;
make_heap(v.begin(),v.end());
while(unsorted > 1) {
--unsorted;
swap(data[0], data[unsorted]);
reheapify_down(data,unsorted);
}
}
和:
template <typename Item, typename SizeType>
void reheapify_down(Item data[], SizeType size) {
SizeType current(0), big_child;
bool heap_ok = false;
while(!heap_ok && 2*current+1 < size) {
if(2*current+2 > size)
big_child = 2*current + 1;
else if(data[2*current+1] > data[2*current+2])
big_child = 2*current+1;
else
big_child = 2*current + 2;
if(data[current] < data[big_child]) {
swap(data[current],data[big_child]);
current = big_child;
}
else
heap_ok = true;
}
}
当我运行程序时,它会输出一个错误排序的数组。是否有一些我遗漏的东西或一些我忽略的错误?
答案 0 :(得分:0)
只是一些建议。
首先,我会编写一个小代理类,它只会让您在集合中使用基于1的索引。堆中使用的所有索引数学都假定基于1的索引,并且在一个地方补偿基于0的索引比在所有代码中更容易。就目前而言,我有足够的时间跟踪索引以确保您的reheapify_down
是正确的。这当然是正确的总体思路,但要确保所有的数学运算都是正确的,需要做很多工作。
其次,我会写一个check_heap
(或其他),您可以用来验证make_heap
和reheapify_down
(另外,我会决定“make_heap”或“heapify”,因此名称可以是“make_heap”和“remake_heap”,也可以是“heapify”和“reheapify”。
然而,除此之外,很难确定问题,特别是因为您没有在问题中包含make_heap
的代码。如果它不能正常工作,其他人就没有希望了。