2014-03-19 91 views
0

我正在爲我的CS類進行非遞歸合併排序,它不完全正常工作。我知道它被調用,因爲當我運行測試程序時,它會改變數組,只是沒有按照正確的順序。有人可以幫忙嗎?謝謝!非遞歸合併排序Java

private static void mergeSort(int[] a, int left, int right) 
{ 
    int midPoint = ((right + left)/2); 
    int[] buffer = new int[19]; 

    selectionSort(a, left, midPoint); 
    selectionSort(a, midPoint-1, right); 
    merge(a, buffer, 0, 9, 19); 
} 

private static void selectionSort(int[] a, int beginning, int end) 
{ 
    int [] temp = new int[end-1]; 

    for(int y = 0; y < end - 1; y++) 
    { 
     temp[y] = a[y]; 
    } 

    for (int i = 0; i < temp.length - 1; i++) 
    { 
     int minIndex = findMinimum(temp, i); 
     if (minIndex != i) 
      swap (temp, i, minIndex); 
    } 
} 

private static int findMinimum(int[] a, int first) 
{ 
    int minIndex = first; 

    for (int i = first + 1; i < a.length; i++) 
    { 
     if (a[i] < a[minIndex]) 
      minIndex = i; 
    } 
    return minIndex; 
} 

private static void swap(int []a, int x, int y) 
{ 
    int temp = a[x]; 
    a[x] = a[y]; 
    a[y] = temp; 
} 

private static void merge(int[] a, int[] temp, int left, int mid, int right) { 
    if (mid >= a.length) return; 
    if (right > a.length) right = a.length; 
    int i = left, j = mid+1; 
    for (int k = left; k < right; k++) { 
     if  (i == mid)  
      temp[k] = a[j++]; 
     else if (j == right)  
      temp[k] = a[i++]; 
     else if (a[j] < a[i]) 
      temp[k] = a[j++]; 
     else     
      temp[k] = a[i++]; 
    } 
    for (int k = left; k < right; k++) 
     a[k] = temp[k]; 
} 
+0

爲什麼在調用'selectionSort'時使用參數'left'和'right',中點'midPoint' - 調用'merge'時使用硬連線常量?爲什麼你硬連線'buffer'的長度 - 爲什麼不'int [] buffer = new int [a.length]'? – ajb

+0

我手動連接它們以確保參數具有正確的值,並且忘記將它們作爲參數 – user3266115

回答

1

可能有其他錯誤,而是一個伸出的是selectionSort實際上並沒有做任何的陣列。你傳遞一個數組引用作爲a參數:

private static void selectionSort(int[] a, int beginning, int end) 

由於這是一個參考,如果selectionSort做過任何分配給的a任何元素,比如

a[x] = y; 

它會改變的元素調用者的數組,就像你想要的一樣。但selectionSort中沒有任何聲明會改變a中的任何內容。該代碼將元素複製到temp,與temp一起使用 - 但是然後將所有工作都拋棄。

+0

謝謝!我意識到selectonSort中的整個臨時事物是不必要的。我剛剛擺脫它,並在第二個循環開始它,並將所有的溫度改爲一個,它的工作!謝謝一堆! – user3266115