2016-04-11 19 views
1

編輯: 現在它只能在前兩個數字中工作,只是這次[1]索引中的數字應與[0]索引中的數字交換。然而,每當我去做,我的程序崩潰...我對我的一個項目我不得不時間不同的排序算法,到目前爲止,我已經讓他們都工作,但我的堆排序。一切似乎工作正常,但是當我輸出排序的數組,前兩個值混亂,我似乎無法找出原因。 13, -33686019, 0, 0:堆排序,除前兩個值以外的所有內容都排序

void heapify(int* array, int index, int size) 
{ 
    int j, temp; 
    temp = array[index]; 
    j = (2 * index); 

    while (j <= size) 
    { 
    if (j < size && array[j + 1] > array[j]) 
      j = (j + 1); 

    if (temp > array[j]) 
      break; 
    else if (temp <= array[j]) 
    { 
      array[(j/2)] = array[j]; 
      j = (2 * j); 
    } 
    } 

array[(j/2)] = temp; 
return; 
} 

void buildHeap(int* array, int size) 
{ 
    int i; 

    for (i = (size/2); i >= 1; i--) 
    { 
     heapify(array, i, size); 
    } 
} 

double heapsort(int* array, int size) 
{ 
    int i; 
    clock_t end, begin; 

    begin = clock(); //Start the timer// 
    buildHeap(array, size); 

    for (i = size; i >= 2; i--) 
    { 
     swap(array[i], array[1]); 
     heapify(array, 1, (i - 1)); 
    } 
    end = clock(); //Stop the timer// 

    return diffClocks(end, begin); //Return the amount of time it took to sort// 
} 

不幸的是,內部的是給我們並改變每個它的運行時間,但輸出的一個示例是一個main()是隨機生成的陣列, 1, 2, 3, 。 。 。 (一切從這裏開始排序)

回答

0
//in heapsort() function 
for (i = size; i >= 2; i--) 
{ 
     swap(array[i], array[1]); 
     heapify(array, 1, (i - 1)); 
} 

//in buildHeap() function 
heapify(array, i, size); 

該代碼塊會給你一個問題(假設你傳遞數組的實際大小爲heapsort()功能),因爲當你說array[i],最初i=size和,數組索引編制從,最大索引是大小-1array[i]給你一個垃圾數據。因此在heapsort()函數中使用i=size-1,在buildHeap()函數中使用heapify(array, i, size-1)函數。

+0

謝謝,我不敢相信我沒有看到。這確實確定了這個龐大的數字,但我仍然有一個像上面那樣的13,它仍然在排序部分的前面,我無法找到它來自哪裏。 – Jab2ak

+0

@ Jab2ak它可能來自您的排序算法的邏輯(不包括排序中的第一個數組元素,** array [0] **)。你應該仔細檢查一遍。 –