Java 快速排序按降序排序,不按升序排序

Java 快速排序按降序排序,不按升序排序,java,quicksort,Java,Quicksort,我刚从书中实现了快速排序算法,得到了奇怪的结果。它可以工作,但它按降序排序,而不是按升序排序。例如:[1,5,2,10,6,9,8,3,7,4] 已排序[10,9,8,7,6,5,4,3,2,1]似乎无法在我的代码中找到源代码: private void quicksort(int[] A, int p, int r) { if (p < r) { int q = partition(A, p, r); quicksort(A, p, q);

我刚从书中实现了快速排序算法,得到了奇怪的结果。它可以工作,但它按降序排序,而不是按升序排序。例如:[1,5,2,10,6,9,8,3,7,4] 已排序[10,9,8,7,6,5,4,3,2,1]似乎无法在我的代码中找到源代码:

private void quicksort(int[] A, int p, int r) {
    if (p < r) {
        int q = partition(A, p, r);
        quicksort(A, p, q);
        quicksort(A, q + 1, r);
    }
}

private int partition(int[] A, int p, int r) {
    int x = A[p]; // pivot
    int i = p;
    int j = r;
    while (true) {

        while (A[i] > x) {
            i++;
        }

        while (A[j] < x) {
            j--;
        }
        if (i < j) {
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        } else {
            return j;
        }
    }
}
如何计算快速排序的空间复杂度


谢谢大家

它在你们的分区函数中,你们是按降序排序的

 while(true) {
 //ignore all the numbers greater than X to left
 while (A[i] > x) {
        i++;
    }
 //ignore all numbers lesser than X to right
 while (A[j] < x) {
        j--;
 }

 //swap a number lesser than X on left with a number greater than X on right
    if (i < j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        i++;
        j--;
    } else {
        //Now the array is so sorted, that all numbers lesser than X are on right of it and greater than X are to left of it. Hence return position of X
        return j;
    }
 }
while(true){
//忽略左侧大于X的所有数字
while(A[i]>x){
i++;
}
//忽略所有右边小于X的数字
while(A[j]
//对于升序:

 while(true) {

 while (A[i] < x) {
        i++;
 }

 while (A[j] > x) {
        j--;
 }

    if (i < j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        i++;
        j--;
    } else {
        return j;
    }
}
while(true){
while(A[i]x){
j--;
}
if(i
这里需要注意的关键点是在分区期间创建小于pivot的所有元素和大于pivot的所有元素的窗口的部分。您的实现是确保在分区结束时,数组的左半部分的所有元素都大于pivot,而右半部分的所有元素都小于pivot。只要做相反的事情,它就会按升序排列

while(A[i]x){
j--;

}
请不要在同一个问题中问两个不同的问题。对于你的第二个问题,你应该用谷歌搜索它。你应该使用一个调试器逐行检查你的程序,以确定它的行为与你预期的不同。O(N^2)是最坏的情况。平均值和最佳值是O(logn)很抱歉,我认为这与我在这里要问的同一个问题有关,我想我应该修改我的第二个问题,因为这不是什么是空间复杂度的问题,问题应该是如何计算它的空间复杂度。这是一个更复杂的问题,可能应该包含在一个单独的问题中(尽管它可能更适合不同的堆栈交换站点)谢谢你,我刚刚更改了A[i]x,并按升序排序。它适用于我在问题中提供的测试,但如果我对这个输入进行测试,它将进入无限循环:int[]A={1,5,1,2,10,6,9,8,3,7,4};啊,也是这么想的。等等,我会更新我的答案!非常感谢,我修改了很多东西,但我从来没有想到在那里增加和减少i和j的值。
 while(true) {

 while (A[i] < x) {
        i++;
 }

 while (A[j] > x) {
        j--;
 }

    if (i < j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        i++;
        j--;
    } else {
        return j;
    }
}