任何人都可以帮助我使用快速排序代码,因为当我向其提供数据时它不会被执行。
我没有得到任何答案。这就像它是一个无限循环或类似的东西。
public class Provo {
public static void swap(int[] a, int i, int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static int HoarePartition(int m , int d, int[] a)
{ int pivot=a[m];
int i=m;
int j=d;
while(i<j)
{
while(a[i]<pivot)
{i=i+1;}
while(a[j]>pivot)
{j=j-1;}
if(i<j)
swap(a,i,j);
}
swap(a,m,j);
return j;
}
public static void quicksort(int m, int d, int[] a)
{
if (m<d)
{ int s=HoarePartition(m,d,a);
quicksort(m,s-1,a);
quicksort(s+1,d,a);
}
}
}
答案 0 :(得分:1)
这部分可能有问题:
if(i<j)
swap(a,i,j);
当a[i]
和a[j]
都等于pivot元素时会发生什么?这意味着它们会被交换,但 lo
和hi
都不会减少,从而导致无限循环。
试试这个:
if(i<j)
swap(a,i++,j--);
这基本上是一个后递增/递减,确保lo
和hi
在每次迭代后更接近。
答案 1 :(得分:0)
问题出在HoarePartition()
函数中
左侧索引,即i
应该从枢轴本身开始搜索一个值(大于枢轴)。
所以声明int i=m;
应为int i=m+1;
修改强>
确保while(i<=j)
而不是while(i<j)
应该做到这一点