三路快排栈溢出了,老师可以帮我看看吗
来源:3-2 栈的基本实现
等待灬
2019-02-17
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;
}
写回答
2回答
-
等待灬
提问者
2019-02-18
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; } }
代码是一样的,边界定义的也没问题啊,但是栈深度溢出了,不知道是不是程序的问题
012019-02-18 -
liuyubobobo
2019-02-18
这个课程不涉及三路快排,请将问题放到相关课程中,谢谢。
另外,请附上你的完整的,可执行的,能够复现你所说的错误的代码,而不仅仅是代码片段:)
加油!:)
00