请稍等 ...
×

采纳答案成功!

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

三路快排栈溢出了,老师可以帮我看看吗

public void quickSort3Way(Comparable[] arr, int n) {
        quickSort3Way(arr, 0, n-1);
    }

    /**
     * 三路快排
     * @param arr  数组
     * @param l   左边界
     * @param r   右边界
     */
    private void quickSort3Way(Comparable[] arr, int l, int r) {
        swap(arr, l, (int) (Math.random()*(r-l+1)) + l);
        Comparable v = arr[l];

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

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

        swap(arr, l, lt);
        quickSort3Way(arr, l, lt-1);
        quickSort3Way(arr, gt, r);
    }

    private static void swap(Object[] arr, int i, int j) {
        Object t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

正在回答 回答被采纳积分+3

2回答

提问者 等待灬 2019-02-18 10:38:36
package algrithms.sort;

public class QuickSort {



    public void quickSort3Way(Comparable[] arr, int n) {
        quickSort3Way(arr, 0, n-1);
    }

    /**
     * 三路快排
     * @param arr  数组
     * @param l   左边界
     * @param r   右边界
     */
    private void quickSort3Way(Comparable[] arr, int l, int r) {
        swap(arr, l, (int) (Math.random()*(r-l+1)) + l);
        Comparable v = arr[l];

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

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

        swap(arr, l, lt);
        quickSort3Way(arr, l, lt-1);
        quickSort3Way(arr, gt, r);
    }

    private static void swap(Object[] arr, int i, int j) {
        Object t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    // 测试 QuickSort
    public static void main(String[] args) {
        QuickSort quickSort = new QuickSort();
      
        int N = 1000000;
        Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100);
        Integer[] arr1 = SortTestHelper.generateNearlyOrderArray(N, 100);
//        for (Integer integer : arr) {
//            System.out.print(integer+"\t");
//        }
        long startTime = System.currentTimeMillis();
        quickSort.quickSort3Way(arr1, N);
        long endTime = System.currentTimeMillis();
        System.out.println("用时" + (endTime-startTime)/1000.00 + "s" );

        /*for (Integer integer : arr) {
            System.out.print(integer+"\t");
        }*/
        return;
    }
}

代码是一样的,边界定义的也没问题啊,但是栈深度溢出了,不知道是不是程序的问题

0 回复 有任何疑惑可以回复我~
  • 这个课程不涉及三路快排,请将问题放到相关课程中,谢谢。
    回复 有任何疑惑可以回复我~ 2019-02-18 10:49:31
liuyubobobo 2019-02-18 07:46:03

这个课程不涉及三路快排,请将问题放到相关课程中,谢谢。


另外,请附上你的完整的,可执行的,能够复现你所说的错误的代码,而不仅仅是代码片段:)


加油!:)

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信