2011-05-18 29 views
0

這裏實現快速排序的一些問題是我的代碼:在Java中

public class Main 
{ 
    public static void main(String[] args) 
    { 
     int[] temp = {4,2,6,4,5,2,9,7,11,0,-1,4,-5}; 
     quickSort(temp); 
     for(int s : temp) System.out.println(s); 
    } 

    public static void quickSort(int[] data) 
    { 
     quickSort(data, 0, data.length); 
    } 

    public static void quickSort(int[] data, int first, int n) 
    { 
     int p, n1, n2; 
     if(n > 1) 
     { 
      p = partition(data, first, n); 
      n1 = p - first; 
      n2 = n - n1 - 1; 
      quickSort(data, first, n1); 
      quickSort(data, p+1, n2); 
     } 
    } 

    private static int partition(int[] A, int first, int n) 
    { 
     int right = first + n - 1; 
     int ls = first; 
     int pivot = A[first]; 
     for(int i = first+1; i <= right; i++) 
     { 
      if(A[i] <= pivot) 
      // Move items smaller than pivot only, to location that would be at left of pivot 
      { 
       ls++; 
       swap(A[i], A[ls]); 
      } 
     } 
     swap(A[first], A[ls]); 
     return ls; 
    } 

    private static void swap(int i, int j) 
    { 
     int temp = i; 
     i = j; 
     j = temp; 
    } 
} 

運行該程序後,它並沒有對數組進行排序,並打印在同一陣列不排序。

4 
2 
6 
4 
5 
2 
9 
7 
11 
0 
-1 
4 
-5 

這個實現有什麼問題?

回答

9

問題是您的swap()函數實際上並不交換數組中的元素,它只是交換兩個整數變量中的值。整數在Java中按值傳遞,而不是通過引用。

private static void swap(int[] array, int pos1, int pos2) { 
    int temp = array[pos1]; 
    array[pos1] = array[pos2]; 
    array[pos2] = temp; 
} 
+0

1:

與重新分配數組值諸如交換函數替換此。好答案。 – 2011-05-18 01:55:56

1

您的交換功能按值傳遞其參數。 Everthing在java中是傳值的。

您的交換功能需要有效傳遞參考:請參閱上面的@matt b的答案。

請參閱Is Java pass by reference?以獲取有關參數傳遞的良好解釋。