C++ c+中的堆排序+;输出不正确
为什么这种堆排序不能给出正确的输出。输出应该是一个排序数组,但会出现一些随机输出。这里有链接。也可以查看这个代码,以便使用现代C++特性。你有什么建议C++ c+中的堆排序+;输出不正确,c++,heap,heapsort,C++,Heap,Heapsort,为什么这种堆排序不能给出正确的输出。输出应该是一个排序数组,但会出现一些随机输出。这里有链接。也可以查看这个代码,以便使用现代C++特性。你有什么建议 #include<iostream> #include<algorithm> #include<vector> int max_heapify(std::vector<int>& v, int i){ int l = 2*i; int r = 2*i +
#include<iostream>
#include<algorithm>
#include<vector>
int max_heapify(std::vector<int>& v, int i){
int l = 2*i;
int r = 2*i + 1;
int largest = 0;
if( (l < v.size()) && (v[l] > v[i]) ){
largest = l;
}
else{
largest = i;
}
if ( (r<v.size()) && (v[r] > v[largest]) ){
largest = r;
}
if ( largest != i){
std::swap(v[i], v[largest]);
max_heapify(v, largest);
}
return 0;
}
int build_max_heap(std::vector<int> &v){
for( int i = v.size()/2; i >= 0; i--){
max_heapify(v, i);
}
return 0;
}
int heap_sort(std::vector<int>& v){
build_max_heap(v);
int length = v.size();
for( int i = length-1 ; i>=1; i--)
std::swap(v[0], v[i]);
length--;
max_heapify(v, v[length]);
}
int main(){
std::vector<int> v = { 1, 2, 9, 8, 3, 4, 7, 6, 5};
heap_sort(v);
for(auto& e : v) std::cout<<e<<" ";
return 0;
}
#包括
#包括
#包括
int max_heapify(标准::向量和向量,int i){
int l=2*i;
int r=2*i+1;
int最大=0;
如果((lv[i])){
最大=l;
}
否则{
最大=i;
}
如果((r v[最大]){
最大=r;
}
如果(最大!=i){
标准::交换(v[i],v[max]);
最大值(v,最大值);
}
返回0;
}
int build_max_heap(std::vector&v){
对于(int i=v.size()/2;i>=0;i--){
max_heapify(v,i);
}
返回0;
}
int堆_排序(std::vector&v){
构建最大堆(v);
int length=v.size();
对于(int i=length-1;i>=1;i--)
交换(v[0],v[i]);
长度--;
max_heapify(v,v[长度]);
}
int main(){
向量v={1,2,9,8,3,4,7,6,5};
堆_排序(v);
对于(auto&e:v)标准::cout所做的更正:
浪费数据的null/size的v[0]条目,因为这样可以简化堆的实现
对于索引=0,不能调用max_heapify()
堆排序中的for循环缺少括号
更正了您可能正在查找的所需堆排序的代码
#include<iostream>
#include<algorithm>
#include<vector>
int max_heapify(std::vector<int>& v, int i,int len){
int l = 2*i;
int r = 2*i + 1;
int largest = 0;
if( (l < len) && (v[l] > v[i]) ){
largest = l;
}
else{
largest = i;
}
if ( (r<len) && (v[r] > v[largest]) ){
largest = r;
}
if ( largest != i){
std::swap(v[i], v[largest]);
max_heapify(v, largest,len);
}
return 0;
}
int build_max_heap(std::vector<int> &v){
for( int i = v.size()/2; i > 0; i--){
max_heapify(v, i,v.size());
}
return 0;
}
int heap_sort(std::vector<int>& v){
build_max_heap(v);
int length = v.size();
for( int i = length-1 ; i>=1; i--){
std::swap(v[1], v[i]);
length--;
max_heapify(v, 1,i);
}
}
int main(){
std::vector<int> v = { 0 \* NULL entry *\ , 1, 2, 9, 8, 3, 4, 7, 6, 5};
heap_sort(v);
for(auto& e : v) std::cout<<e<<" ";
return 0;
}
#包括
#包括
#包括
int max_heapify(标准::向量&v,int i,int len){
int l=2*i;
int r=2*i+1;
int最大=0;
if((lv[i])){
最大=l;
}
否则{
最大=i;
}
如果((r v[最大]){
最大=r;
}
如果(最大!=i){
标准::交换(v[i],v[max]);
最大值(v,最大值,len);
}
返回0;
}
int build_max_heap(std::vector&v){
对于(int i=v.size()/2;i>0;i--){
max_heapify(v,i,v.size());
}
返回0;
}
int堆_排序(std::vector&v){
构建最大堆(v);
int length=v.size();
对于(int i=length-1;i>=1;i--){
标准::交换(v[1],v[i]);
长度--;
max_heapify(v,1,i);
}
}
int main(){
向量v={0\*空条目*\,1,2,9,8,3,4,7,6,5};
堆_排序(v);
对于(auto&e:v)std::cout,解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题将包括一个重现您的问题的示例,以及您在调试器中所做的观察。感谢您对此进行研究。在max_heapify()中传递len有什么用。我认为向量通过size()承载自己的长度 method@anekix,它告诉max_heapify只查找向量的最上面的len值。heap_sort函数使用它。heap_sort重复从最上面取最大值并放在后面,使heap的有效“len”更小。@anekix,如果你喜欢,请不要忘记对答案进行投票并接受它。