import java.util.Random;
public class Quicksort {
private int partition(int arr[], int first, int last) {
int pivot = arr[last]; //Using last element as pivot
int i = (first-1);//index of smaller element
for (int j = first; j < last; j++) {
//if current element is smaller than or equal to pivot
//then swap the elements
if (arr[j] <= pivot) {
i++;
//swapping occurs here
//make a temp variable to the first element
//swap arr[j] and arr[i]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
//i++;
}
}
int temp = arr[i+1];
arr[i+1] = arr[last];
arr[last] = temp;
return i+1;
}
private void quickSort(int arr[], int first, int last) {
if (first < last) {
int pivindex = partition(arr, first, last);
quickSort(arr, first, pivindex-1);
quickSort(arr, pivindex+1, last);
}
}
public void sort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
public static int[] getRandoms(int count) {
return new Random().ints().limit(count).toArray();
}
public static void main(String[] args) {
Quicksort fix = new Quicksort();
int[] randoms = getRandoms(40000);
double startTime = System.currentTimeMillis();
fix.sort(randoms);
double endTime = System.currentTimeMillis();
System.out.println("Performance Time on Random Data:" + (endTime - startTime));
//Benchmarking quicksort on already sorted data
startTime = System.currentTimeMillis();
fix.sort(randoms);
endTime = System.currentTimeMillis();
System.out.println("Performance Time on Sorted Data:" + (endTime - startTime));
}
}
我不完全确定为什么我会收到Stackoverflower。当我只排序一次时,代码运行正常,但是,如果我尝试将相同的数据排序两次,那就是当我得到错误时。
我理解Stackoverflower是因为使用递归存在问题。在这种情况下,我的错误来自
线程“main”java.lang.StackOverflowError中的异常 在quicksort.Quicksort.quickSort(Quicksort.java:36)
是......
if (first < last) {
int pivindex = partition(arr, first, last);
quickSort(arr, first, pivindex-1);
quickSort(arr, pivindex+1, last);
}
答案 0 :(得分:1)
@ mackycheese21当我说它运行正常时,我的意思是如果我使用一个较小的阵列,我可以打印出来看看,它将打印出来排序。排序40,000个随机整数也一样,直到我尝试对已排序的数组进行排序。
所以我想你只想检查数组是否已排序。
因为这看起来效率不高,所以我能想到的另一件事就是你的'f'
方法,对于排序数组,给出第一个或最后一个索引 - 分区时给出一个空数组和满阵列。这可能导致无限递归。
我建议您只需在partition
中添加一个检查,以检查索引是转到第一个还是最后一个,然后如果确实发生这种情况,只需在中间拆分。