我尝试调试此代码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]
答案 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);
}
}