2016-03-15 242 views
-1

我无法猜测我的代码有什么问题。 输入:10,7,8,9,1,5 OUTPUT:5 7 9 8 10 1这个QuickSort实现有什么问题?

public class QuickSort { 

    public static void quickSort(int arr[], int p, int r) { 

     if (p < r) { 
      // System.out.println(p+" "+r); 
      int q = partition(arr, p, r); 
      quickSort(arr, p, q - 1); 
      quickSort(arr, q + 1, r); 
     } 
    } 

    public static int partition(int arr[], int p, int r) { 
     int pivot = arr[r]; 
     int i = p - 1; 
     for (int j = p; j < r - 1; j++) { 
      // System.out.println("j"); 
      if (arr[j] <= pivot) { 
       i = i + 1; 
       int temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
      } 
     } 
     int temp = arr[i + 1]; 
     arr[i + 1] = arr[r]; 
     arr[r] = temp; 
     return i + 1; 
    } 

    static void printArray(int arr[]) { 
     int n = arr.length; 
     for (int i = 0; i < n; ++i) 
      System.out.print(arr[i] + " "); 
     System.out.println(); 
    } 
} 

请明晰我的疑问,在哪里兑换代码,以便它工作正常。

+0

'partition'的返回值的确切语义是什么? – Codor

回答

2

你没有迭代到循环的最后(最后一个元素)。因此,分区函数不会正确地将元素分离为较小的左侧的枢轴和更大的枢轴右侧。

您的循环

for (int j = p; j < r - 1; j++) { 

变化

for (int j = p; j <= r - 1; j++) { 

现在是工作的罚款。 请看这里Ideone

+1

伟大的人..它的工作。感谢您的快速回复。 – naveen

+1

请阅读[回答]。你应该解释为什么需要这种改变。 –

+0

@JimGarrison谢谢。我现在已经完成了。 – FallAndLearn