Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的快速排序算法排序不正确(第一个元素作为枢轴)_Java_Algorithm_Quicksort - Fatal编程技术网

java中的快速排序算法排序不正确(第一个元素作为枢轴)

java中的快速排序算法排序不正确(第一个元素作为枢轴),java,algorithm,quicksort,Java,Algorithm,Quicksort,我正在做一项任务,我们应该在其中实现快速排序,第一个元素作为轴心。我的代码中有一个小错误,导致列表中的元素(用于测试)排序错误。输出应该是1 3 7 8 9 10,但最终是1 7 3 8 9 10(7和3应该切换位置)。我怀疑错误可能在第15-26行之间,但我似乎找不到它,尽管有很多人试图修复它 谁能看出有什么不对劲 (在第一个while循环中,我尝试了使用I-lo){ 返回; } int pivot=a[lo]; int i=lo; int j=hi+1; 内部温度; i++; j--; 而(

我正在做一项任务,我们应该在其中实现快速排序,第一个元素作为轴心。我的代码中有一个小错误,导致列表中的元素(用于测试)排序错误。输出应该是1 3 7 8 9 10,但最终是1 7 3 8 9 10(7和3应该切换位置)。我怀疑错误可能在第15-26行之间,但我似乎找不到它,尽管有很多人试图修复它

谁能看出有什么不对劲

(在第一个while循环中,我尝试了使用I-lo){ 返回; } int pivot=a[lo]; int i=lo; int j=hi+1; 内部温度; i++; j--; 而(ipivot){ j--; }
如果(i这可以解决您的问题:

public static void quickSort(int[] a, int lo, int hi) {
        if (!(hi > lo)) {
            return;
        }
        int pivot = a[lo];
        int i = lo - 1;
        int j = hi + 1;
        int temp;
        while (i < j) {
            do {
                i++;
            } while (a[i] < pivot);
            do {
                j--;
            } while (a[j] > pivot);
            if (i < j) {
                switchPlace(a, i, j);
                i++;
                j--;
            }
        }
        switchPlace(a, lo, j);
        quickSort(a, lo, j - 1);
        quickSort(a, j + 1, hi);
    }
publicstaticvoidquicksort(int[]a,int-lo,int-hi){
如果(!(高>低)){
返回;
}
int pivot=a[lo];
int i=lo-1;
int j=hi+1;
内部温度;
而(ipivot);
if(i
我将在这里介绍调试此类算法的简单方法,包括:

  • 对代码的较小部分应该产生的内容做出一些预期
  • 验证这些期望是否得到满足
  • 第一点涉及到对代码尝试执行的某些细节的理解,而第二点则意味着使用某种工具进行检查。此特定答案中举例说明的“工具”包括使用
    print
    消息,但通常它可以是其他的东西(例如步骤调试器)


    qsort算法的主要操作是围绕轴交换元素,以便较小的值在轴之前,较大的值在轴之后。 此过程发生在
    lo
    hi
    索引之间的各种子序列中

    现在,让我们检查每个子序列是否正确执行了此操作。 为此,我们可以显示初始子序列,以及交换发生后的子序列,以便之后可以手动检查此操作是否正确执行

    在交换部件之前,我们可以使用类似以下代码:

        System.out.print("before: ");
        for (int k = lo; k <= hi; k++) {
            System.out.print(a[k] + ", ");
        }
        System.out.println();
    
        System.out.print("after: ");
        for (int k = lo; k <= hi; k++) {
            System.out.print(a[k]);
            if (k == j) {
                System.out.print(" (pivot)");
            }
            System.out.print(", ");
        }
        System.out.println();
        System.out.println();
    

    图片和截图可以很好地添加到帖子中,但请确保没有它们的帖子仍然清晰有用。不要发布代码或错误消息的图片。而是直接复制粘贴或键入实际代码/消息到帖子中。是的,很抱歉,在我发布后才意识到。更改了。这可能有用谢谢!我会的看看@lakindu一开始似乎你的解决方案是有效的,因为它为
    int[]a={9,3,10,1,8,7};
    。尝试了另一个输入,但不幸失败。尝试了
    int[]a={24,2,45,20,56,75,2,56,99,53,12}
    它给出了输出
    2 20 12 75 45 56 24 53 56 99
    @Robert D.Mogos不要只说“这解决了它”。请指出您所做的更改,并对其进行修改。在第一个while循环中添加little=似乎可以达到目的!尽管这很奇怪,因为它以前不起作用,但我不会抱怨,因为它现在起作用了。非常感谢您详细的教育性回复,这非常有帮助@qwertyman@Isus没问题,很高兴能帮上忙。也许真的有请告诉我上次尝试在while循环中使用“=”后所做的其他修改。@Isus同样,我很高兴您看到这个答案具有教育意义。当它被否决时,我担心它可能听起来很傲慢:-),这绝不是我的本意。提出期望并检查它们是至关重要的(不管是基于使用打印、调试器还是其他任何技术),在编程课程中经常没有解释。我很可能做了一些其他的修改。虽然我不记得是哪一个,但我做了这么多的修改以发现错误。我认为你的答案非常广泛,解释得很好。当它被否决时,我自己感到惊讶,我不认为它听起来很傲慢:)@qwertyman
        System.out.print("after: ");
        for (int k = lo; k <= hi; k++) {
            System.out.print(a[k]);
            if (k == j) {
                System.out.print(" (pivot)");
            }
            System.out.print(", ");
        }
        System.out.println();
        System.out.println();
    
    public static void quickSort(int[] a, int lo, int hi) {
        if (!(hi > lo)) {
            return;
        }
        int pivot = a[lo];
        int i = lo;
        int j = hi + 1;
        int temp;
        i++;
        j--;
    
        System.out.print("before: ");
        for (int k = lo; k <= hi; k++) {
            System.out.print(a[k] + ", ");
        }
        System.out.println();
    
        while (i <= j) {
            while (a[i] < pivot) {
                i++;
            }
            while (a[j] > pivot) {
                j--;
            }
            if (i <= j) {
                switchPlace(a, i, j);
                i++;
                j--;
            }
        }
        switchPlace(a, lo, j);
    
        System.out.print("after: ");
        for (int k = lo; k <= hi; k++) {
            System.out.print(a[k]);
            if (k == j) {
                System.out.print(" (pivot)");
            }
            System.out.print(", ");
        }
        System.out.println();
        System.out.println();
    
        quickSort(a, lo, j - 1);
        quickSort(a, j + 1, hi);
    }
    
    public static void switchPlace(int[] a, int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
    
    public static void printList(int[] a) {
        String res = "";
        for (int i = 0; i < a.length; i++) {
            res += a[i] + " ";
        }
        System.out.println(res);
    }
    
    public static void main(String[] args) {
        //int[] a = {3, 7};
        //int[] a = { 9, 3, 10, 1, 8, 7 };
        int[] a = {24, 2 , 45 ,20 ,56 ,75 ,2 ,56 ,99 ,53 ,12};
        quickSort(a, 0, a.length - 1);
        printList(a);
    }