首先递归quicksort的小方面

时间:2014-08-22 00:57:31

标签: java quicksort

我尝试调试此代码I found以制作快速排序,首先对较小的分区进行排序。

public static void quicksortSmallSide(int[] a, int p, int r)
{
    int q = p;
    while(p<r)
    {
        q = partition(a,p,r);
        if(q < (p + (r-p)/2))
        {
            quicksortSmallSide(a,p,q);
            p = q+1;
        }
        else
        {
            quicksortSmallSide(a,q+1,r);
            r = q-1;
        }
    }
} 

输入[20,19,20]用于给出错误的输出[20,19,20],我意识到了。我想通过将其更改为以下代码来修复它,但我认为它没有错误

public static void quicksortSmallSide(int[] a, int p, int r)
{
    if(r-p< 1)
        return;
    int q = p;
    while(p<r)
    {
        q = partition(a,p,r);
        if(q < (p + (r-p)/2))
        {
            quicksortSmallSide(a,p,q);
            p = q+1;
        }
        else
        {
            quicksortSmallSide(a,q+1,r);
            r = q-1;
        }
        System.out.println();
    }
                    quicksortSmallSide(a,p,q);
} 

例如
{70, 24, -74, 9, 58, -61, -86, 7, -78, 11, -73, 13, -93}
 被分类到
[-93, -86, -74, -73, 7, -61, 9, 11, -78, 24, 58, 13, 70]

1 个答案:

答案 0 :(得分:1)

您的代码看起来不正确,所以我的分区方法可能与您的分区方法略有不同,但此代码可以正常运行。此代码没有考虑到可能存在更多分区值的一个实例。

private static void quickSort(int[] arr, int lo, int hi){
  if(lo >= hi) return;

  int p = partition(arr, lo, hi);

  // modified to choose small partition first

  if((p - lo )<=(hi-p)){
    System.out.println(String.format("Sorting left first %d %d %d",lo,p,hi)) ;
    quickSort(arr, lo, p);
    quickSort(arr, p+1, hi);
  }else {
    System.out.println(String.format("Sorting right first %d %d %d",lo,p,hi)) ;
    quickSort(arr, p+1, hi);
    quickSort(arr, lo, p);
  }
}