2016-07-25 216 views
1

我有这样的代码,我使用的算法我在维基百科上找到写道:鉴于此输入快速排序算法不排序最终元素?

public static void quicksort(int[] arr, int low, int hi) 
    { 
     if(low < hi) 
     { 
      int pivot = part(arr, low, hi); 
      quicksort(arr, low, pivot - 1); 
      quicksort(arr, pivot + 1, hi); 
     } 
    } 
    public static int part(int[] arr, int low, int hi) 
    { 
     int pivot = arr[hi]; 

     int i = low; 
     for(int j = low; j < hi - 1; j++) 
     { 
      if(arr[j] <= pivot) 
      { 
       swap(arr, i, j); 
       i++; 
      } 
     } 
     swap(arr, i, hi); 
     return i; 
    } 

    public static void swap(int[] ar, int a, int b) 
    { 
     int temp = ar[a]; 
     ar[a] = ar[b]; 
     ar[b] = temp; 
    } 

31, 5, 5, 5, 5, 4, 4, 4, 5, 4 

,不要指望得到:

4, 4, 4, 4, 5, 5, 5, 5, 5, 31 

而是我得到:

4, 4, 4, 4, 5, 5, 5, 5, 31, 5 

什么给?

我打电话与初始排序:quicksort(array, 0, array.Length - 1);

+1

考虑尝试'快速排序(数组,0,array.Length)' –

+0

当我这样做时,超出数组的边界。零索引意味着较高的索引比长度小一个。 –

回答

2

如果你把它用Length - 1,那么这个循环:

for (int j = low; j < hi - 1; j++) 

..should是:

for (int j = low; j <= hi ; j++) 
+1

修复它。谢谢。我只需要第二组眼睛就可以看到它,因为我看不到那个错误。我会尽快接受,但现在不会让我。 –