请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

快速排序,sort递归误写成partition递归,竟然正确排序,速度翻倍,不解原因

bobo老师,关于快速排序基础版本代码,我无意间把sort的递归写成了partition递归,结果排序正确,还快了10倍。并且对于NearlyOrder的输入对速度也没有任何影响。这个该如何理解?

private static void sort(Comparable[] arr, int l, int r){
    if(l > r)
        return;

    int p = partition(arr, l, r);
    partition(arr, l, p-1);
    partition(arr, p+1, r);
}

private static int partition(Comparable[] arr, int l, int r){
    Comparable v = arr[l];
    int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v
    for(int i = l+1; i <= r; i++){
        if(arr[i].compareTo(v) < 0){
            j++;
            swap(arr, j, i);
        }
    }
    swap(arr, l, j);
    return j;
}

正在回答

1回答

liuyubobobo 2019-02-28 19:29:15

这个代码显然不能正确排序。整个过程只是在sort中调用了三次partition而已。partition自己没有调用自己,也不是一个递归函数。调用三次partition不可能排序成功。(也因为这个过程只是调用了三次partition而已,所以速度很快。)


如果你的程序使用assert进行的判断,但没有中断,应该是运行时没有打开assert,可以参考这里https://coding.imooc.com/learn/questiondetail/48418.html 或者自行把代码修改成抛异常的方式。或者直接把结果打印出来看一下。


继续加油!:)

2 回复 有任何疑惑可以回复我~
  • 提问者 慕运维7111006 #1
    确实是assert没有出来,谢谢bobo老师。
    回复 有任何疑惑可以回复我~ 2019-02-28 19:38:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信