快速排序,代码有错误,老师帮忙看一下,是哪里的问题

来源:3-8 三路快速排序法

慕容9054781

2020-02-18

package com.imooc.sort;

public class QuickThreeSort {

public static void main(String[] args) {
    int[] a = new int[]{2, 3, 5, 6, 1, 9, 4, 8};
    sort(a);
    print(a);
}

private static void sort(int[] a){
    sort(a,0,a.length);
}

/**
 * 将 a[l...r] 分为 <v ;  ==v  ; >v 三部分
 * 之后递归 对  <v , >v  两部分进行三路快速排序
 */


private static void sort(int[] a,int l,int r){

    if (l>=r) {
        return;
    }

    int v=a[l];

    int lt=l; // a[l...lt] <v
    int gt=r; // a[gt...r] >v
    int i=l+1;// a[lt+1...i] ==v

    while(i<gt){
        if (a[i]<v) {
            swap(a,lt+1,i);
            lt++;
            i++;
        }else if(a[i]>v){
            swap(a,gt-1,i);
            gt--;
        }else{
            i++;
        }
    }

    swap(a,l,lt);

    sort(a,l,lt-1);
    sort(a,gt,r);
}

private static void swap(int[] a,int i,int j){
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}

private static void print(int[] a){
    for (int i : a) {
        System.out.print(a[i]+" ");
    }
}

}

写回答

2回答

weibo_溪林菁菁_0

2020-07-29

问题解决了吗?

0
1
weibo_溪林菁菁_0
gt的起始边界有问题
2020-07-29
共1条回复

liuyubobobo

2020-02-19

抱歉,你的代码没有任何注释,我完全不知道你的思路。而且我无法做到同学一贴错误的代码,马上把正确的代码调试出来。如果这样的话,我就没法做别的了。问答区是用于问答的,不是我给大家调试代码的。请谅解。


课程中,我已经将算法的代码思路在视频中进行了详细的介绍。如果你需要 Java 语言的参考,对于这一小节的代码,可以参考这里:https://git.imooc.com/coding-71/coding-71/src/master/03-Sorting-Advance/Course%20Code%20%28Java%29/08-Quick-Sort-Three-Ways/src/bobo/algo 


你可以尝试在你的环境下运行课程的官方代码,看是否有问题?如果没有问题,请仔细调试比对,看自己的代码哪里有问题?


如果你的代码是错误的,在一个极小的测试用例中应该就能展现出来。我的建议是你使用一个极小的测试用例,比如只有 7 个元素,进行调试,仔细跟踪程序的每一步运行,变量的变化是怎样的,和你想的是否一样,如果不一样,自己的想法哪里是错误的?


调试程序是程序员的必备能力,甚至大部分软件工程师 80% 的时间都是在调试,而非编码。对程序逻辑的深入理解和进步,就在这个过程中哦。


如果还有不理解的地方,请详细描述:具体对于什么测试用例,在哪一句,你的逻辑想法是怎样的?你认为结果是怎样的?实际却又是怎样的?你为什么认为程序不应该产生升这样的结果?


继续加油!:)

0
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程