为什么我的快速排序代码不起作用?

时间:2014-01-19 17:41:13

标签: java quicksort

任何人都可以帮助我使用快速排序代码,因为当我向其提供数据时它不会被执行。

我没有得到任何答案。这就像它是一个无限循环或类似的东西。

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);
    }
}
}

2 个答案:

答案 0 :(得分:1)

这部分可能有问题:

if(i<j)
  swap(a,i,j);

a[i]a[j]都等于pivot元素时会发生什么?这意味着它们会被交换,但 lohi都不会减少,从而导致无限循环。

试试这个:

if(i<j)
  swap(a,i++,j--);

这基本上是一个后递增/递减,确保lohi在每次迭代后更接近。

答案 1 :(得分:0)

问题出在HoarePartition()函数中 左侧索引,即i应该从枢轴本身开始搜索一个值(大于枢轴)。

所以声明int i=m;应为int i=m+1;

修改
确保while(i<=j)而不是while(i<j)应该做到这一点