2012-10-08 121 views
0

我有一個女巫堆排序問題。我不知道我的代碼有什麼問題。這個程序只改變了表中的第二個和最後一個位置。這是我的代碼(沒有主要功能):堆排序heapify排序

#include<stdio.h> 
#define DUZO 100000000 
int heap_size; 
int tab[DUZO]; 

void heapify(int start){ 
    int l, r, largest, pom; 

    l = 2*start + 1; 
    r = 2*start + 2; 

    if((l < heap_size) && (tab[l] > tab[start])) 
     largest = l; 
    else 
     largest = start; 

    if((r < heap_size) && (tab[r] > tab[largest])) 
     largest = r; 
    if(largest != start){ 
     pom = tab[start]; 
     tab[start] = tab[largest]; 
     tab[largest] = pom; 

     heapify(largest); 
    } 
} 

void build_max(){ 
    int lenght, i; 
    lenght = heap_size; 

    for(i = ((lenght - 1)/2); i >= 0; --i){ 
     heapify(i); 
    } 
} 

void heap_sort(){ 
    int i; 
    build_max(); 


    for(i = heap_size-1; i > 0; --i) { 
     int tmp = tab[0]; 
     tab[0] = tab[i]; 
     tab[i] = tmp; 
     --heap_size; 
     heapify(0); 
    } 
} 

感謝您的一切幫助。

+1

如果您逐行添加解釋每個語句,循環和函數的*目的*的註釋,它可能會幫助他人閱讀此代碼。在這樣做的過程中,您可能會發現代碼實際執行的地方與您打算執行的操作不一致。 –

+0

爲什麼不僅僅使用許多現有的heapsort實現之一而不是試圖編寫自己的? –

+0

同意,有人在評論中標記爲close。我將標記爲保持打開狀態,但您應該添加註釋並顯示輸出(使用小型輸入數據集)並提供一個主體,以便它可以在不進行編輯的情況下運行。 –

回答

1
int heap_size = 6; 
int tab[5]; 

這要求寫入(和閱讀)過去的數組的末尾,導致與可能不好的後果不確定的行爲。

將堆大小和數組作爲全局變量是一個壞主意,它們應該是函數的參數。

l = 2*start + 1; 
r = 2*start + 2; 

這是因爲當你有堆的索引0處的頂部的索引,但

if((l <= heap_size) && (tab[l] > tab[start])) 

是檢查是否有堆的頂部索引1.對於指數將使用0,那應該是<(也在下一個檢查r)。

void build_max(){ 
    int lenght, i; 
    lenght = heap_size; 

    for(i = ((lenght - 1)/2); i > 0; i--){ 
     heapify(i); 
    } 
} 

忘記heapify頂部,所以它不一般的創建一個堆,條件應該是i >= 0

void heap_sort(){ 
    int i, lenght; 
    build_max(); 
    lenght = heap_size; 

    for(i = lenght; i > 1; i--){ 
     heap_size -= 1; 
     heapify(i); 
    } 
} 

不交換最後一個位置的堆頂部,所以它根本不排序。循環應該看起來像

for(i = heap_size-1; i > 0; --i) { 
    /* swap top of heap in the last position */ 
    int tmp = tab[0]; 
    tab[0] = tab[i]; 
    tab[i] = tmp; 
    --heap_size; /* urk, but what can we do if heapify uses the global? */ 
    heapify(0); /* we need to heapify from the top, since that's where the leaf landed */ 
} 

實際上排序數組。

+0

「,如果您在索引1處有堆的頂部,那麼將使用該檢查。對於索引0,應該是<(也在下一個r檢查中)」在哪個地方我必須更改<? – henio180

+0

在'if((l <= heap_size)'和'r'的對應行另一件事是,一旦你開始在最後一個位置交換堆頂部,你需要調用'heapify(0)' 'heapify(i)',因爲葉被交換到位置0. –

+0

好的我已經改變了它,但它仍然沒有工作:( – henio180