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 +

为什么这种堆排序不能给出正确的输出。输出应该是一个排序数组,但会出现一些随机输出。这里有链接。也可以查看这个代码,以便使用现代C++特性。你有什么建议

 #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,如果你喜欢,请不要忘记对答案进行投票并接受它。