2012-08-07 61 views
0

所以我剛剛完成我的合併排序的實現,但它發生在我身上,我沒有刪除從遞歸調用返回的內存,因此我添加了刪除語句,然後突然我的合併排序不會不工作.....爲什麼在我的函數結尾添加刪除語句會把所有東西搞砸?我需要釋放內存嗎?刪除在另一個函數中分配的內存?

的代碼如下:

/** 
* Runs merge sort on this ArrayList<T>. Interface function to the central, 
* recursive, merge sort function. 
*/ 
template<class T> 
void ArrayList<T>::mergeSort() { 

    T* temp = mergeSort(array, size); 
    delete [] array; 
    array = temp; 
} 

/** 
* Runs merge sort on the passed in array. Recursive. 
* 
* @param array the array to sort. 
* @param arraySize the size of the array that is to be sorted. 
* @return the sorted array. 
*/ 
template<class T> 
T* ArrayList<T>::mergeSort(T* array, int arraySize) { 

    T* returnArray = array; 

    //If the array is more than one element. 
    if (arraySize > 1) { 

     int size1 = arraySize/2; 
     int size2 = arraySize - size1; 

     T* array1; 
     T* array2; 

     //Recurse. 
     array1 = mergeSort(array, size1); 
     array2 = mergeSort(array + size1, size2); 

     returnArray = new T[arraySize]; 

     //Loop through all elements in returnArray. 
     int i = 0, j = 0, k = 0; 
     while (i < arraySize) { 

      //Place the lesser of two elements in returnArray. 
      if ((array1[j] <= array2[k] && j < size1) 
        || k == size2) { 

       returnArray[i] = array1[j]; 
       j++; 
      } 
      else { 

      returnArray[i] = array2[k]; 
       k++; 
      } 

      i++; 
     } 

/---這些是問題DELETES !! -----/

 delete [] array1; 
     delete [] array2; 
    } 

    return returnArray; 
} 
+0

當您說「突然我的合併排序不起作用」時,您的意思是什麼?它會崩潰嗎?它會產生不正確的結果嗎?還有別的嗎?您需要更具體,並告訴我們您看到的任何具體的錯誤消息。 – user1118321 2012-08-07 04:40:22

+0

沒有給出具體的錯誤,我運行它,它崩潰...非常突然;) – Ethan 2012-08-07 12:46:20

回答

3

我看到一個問題,當陣列大小等於到2 因爲你打電話

array1 = mergeSort(array, size1); 
array2 = mergeSort(array + size1, size2); 

和尺寸1 = 1,size2個= 1 然後這兩個CA的LLS將返回,你將不得不在變量

array1 = array; 
array2 = array+1; 

和數組2以下值未分配的內存地址,從而刪除它應該失敗,錯誤或者做一些不確定的,所以我會建議固定你繼續前

+0

真棒!這解決了它!謝謝您的幫助! – Ethan 2012-08-07 12:45:29

1

我還沒有看完全部細節,但有一點需要注意:當mergeSort被一個大小爲<= 1的數組調用時,它將返回傳遞的數組而不分配新的數組,但在遞歸調用返回時,您將嘗試無論如何刪除它。您可以通過添加以下內容來改進代碼:

if (size1 > 1) 
    delete [] array1; 
if (size2 > 1) 
    delete [] array2; 
相關問題