2017-04-10 69 views
-2

我的程序有問題。它適用於較少數量的參數,但例如對於輸入13 5 10 8 6 22 11 3 12 20 7 9 14 17 19 1 2 18它返回1,3,5,6,7,8,9,10,11,12,13,14,17,19,20,22,2,18,。我真的不知道什麼可能是錯的。合併排序 - 程序不檢查兩個最後的位置。

功能

void mergeSort(int arr[], int arrSort[], int first, int mid, int last) { 
    int from = first; 
    int to = mid; 
    for (int i = first; i<last; i++) { 
     if ((arr[from] <= arr[to] && from<mid) || to >= last) { 
      arrSort[i] = arr[from]; 
      from++; 
     } else if ((arr[to]<arr[from] && to<last) || from >= mid) { 
      arrSort[i] = arr[to]; 
      to++; 
     } 
    } 
    for (int i = first; i<last; i++) 
     arr[i] = arrSort[i]; 
} 

void mergeSortIter(int array[], int size) { 
    int *a = new int[size]; 
    for (int i = 1; i <= size; i *= 2) { 
     showArray(array, size); 
     for (int j = i; j <= size; j += (2 * i)) 
      mergeSort(array, a, j - i, j, min((j + i), size)); 
    } 
} 

其餘部分的代碼

https://pastebin.com/2ugS5ZpZ

+1

把所有相關的代碼放在這裏。如果它是很多代碼,只要它是最少量的再現就沒問題。 – AndyG

+0

您正在索引數組之外,導致未定義的行爲。找出在哪裏作爲練習。 (在'mergeSort'中插入一些跟蹤輸出。) – molbdnilo

+1

**當你得到這個工作**。獲得代碼審查是一個好主意。 https://codereview.stackexchange.com –

回答

0

爲mergesortIter(內環)可以簡化的(這也可以固定的電勢問題,我沒有檢查所有可能的問題):

for (int j = 0; j < size; j += (2 * i)) 
     mergeSort(array, a, j, min(j+i, size), min(j+2*i, size)); 

對於歸併函數,這是一個真正的合併功能,一對if語句檢查之前,如果一個索引超出範圍進行比較的數據。當達到運行結束時,它也不會複製剩餘的數據。這裏是一個另類:

 if (from < mid && (to >= last || A[from] <= A[to])) { 
      B[i] = A[from]; 
      from = from + 1; 
     } else { 
      B[i] = A[to]; 
      to = to + 1;  
     } 

注意,從變量最後將得到更好的命名爲離開年底