2016-09-25 78 views
-4

爲什麼這種堆排序沒有給出正確的輸出。輸出應該是一個排序的數組,但一些隨機輸出即將到來。這裏是鏈接https://ideone.com/4eD289。任何人都可以查看此代碼,以便它使用現代C++功能。你有什麼建議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; 
} 
+2

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

回答

0

作出更正:

  1. 浪費在V [0]數據的空/大小條目我會做執行堆容易的。
  2. max_heapify()不能被索引爲index = 0。
  3. 你在for循環heap_sort缺少括號。

更正了您希望查找的堆排序的代碼。

#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; 
} 
+0

感謝您關注此事。 max_heapify()中傳遞len的用法是什麼?我認爲矢量通過size()方法攜帶它自己的長度 – anekix

+0

@anekix,它告訴max_heapify只查看矢量的最高len值。它由heap_sort函數使用。 heap_sort反覆從頂部取最大值,並把後面的值作爲堆的有效'len'值。 – v78

+0

@anekix,如果你喜歡並接受它,請不要忘記提出答案。 – v78