C++输出中的堆排序不正确

heap sort in c++ output not correct

为什么这个堆排序没有给出正确的输出。输出应该是一个排序数组,但一些随机输出即将到来。这是 link https://ideone.com/4eD289 。任何人都可以查看此代码,以便它使用现代 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;   
}

更正:

  1. 浪费 null/size 数据的 v[0] 条目,因为我会使堆的实现变得容易。
  2. max_heapify() 不得为索引=0 调用。
  3. 您在 heap_sort 中的 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;   
}