java - 快速排序Java中的无限循环

标签 java algorithm quicksort

我尝试实现一种快速排序算法,但是当我运行我的代码时,它给了我一个无限循环,我不明白,我在代码中的分区方法哪里出错了:

public static int partition(int[] a, int p, int r)
{
    int x = a[p];
    int i = p;
    int j = r + 1;
    while(true)
    {
        while(a[i] < x) 
        {
            i++;
            if (i == r) break;
        }
        while(x > a[j]) 
        {
            j--;
            if (j == p) break;
        }
        if (i >= j) break;

        int tmp = a[i];
        a[i] = a[j];
        tmp = a[i];
    }

    int exch = a[p];
    a[p] = a[j];
    exch = a[p];

    return j;
}

此代码的输入数据:

private static int[] array;
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args){
    int n, m;
    n = sc.nextInt();
    array = new int[n+1];
    int i,j;
    for (i = 0; i != array.length-1; i++)
        array[i] = sc.nextInt();


    for (j = 0; j !=array.length-1; i++)
        System.out.print(array[j]);
    quickSort(array,0,array.length);

}

最佳答案

尝试

a[j] = exch;

代替

exch = a[p];

和相同的错误——感谢@Namer 和@Zhuinden——在你的代码中:

int tmp = a[i];
a[i] = a[j];
tmp = a[i];

感谢@DeepanshuBedi,Quicksort in Java - Tutorial有算法的描述。它有

i++;
j--;

在循环交换之后。

另外,函数应该是递归的:

if (low < j)
  quicksort(low, j);
if (i < high)
  quicksort(i, high); 

而不是你的第二次交换。

我建议您从该页面复制代码——您的代码在我看来不是快速排序。

关于java - 快速排序Java中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24929663/

相关文章:

java - 使用 Visitor 和 Composite 模式构建过滤流

algorithm - 如何以编程方式实现2D装箱?

algorithm - 有什么只能通过递归来实现的吗?

algorithm - a和b之间的数的除数之和

javascript - 这个 QuickSort 实现有什么问题?

c - Quicksort - 为什么我的 dutch-flag 实现比我的 Hoare-2-partition 实现慢?

algorithm - 桶排序运行时间

java - 添加组件后 JTable 为空

java - 使用 Selenium 找出选择了哪个单选按钮(实现为 li)

java - 如何在 Java 中格式化文本字段中的输出?