public class QuicksortFixedPivotInsertion implements IntSorter{
InsertionSort insert = new InsertionSort();
public int partition(int [] array, int first, int last){
int middle = (first+last)/2;
swap(array, middle, last);
int pivot = array[last];
int i = first-1;
for (int j = first; j < last; j++){
if (array[j]<pivot){
i++;
swap(array, i, j);
}
}
swap(array, i+1, last);
return i+1;
}
private void quickSort(int [] array, int first, int last){
if(first < last){
if ((last - first) < 10){
insert.insertionSort(array, first, last);
}
else {
int pivot = partition(array, first, last);
quickSort(array, first, pivot - 1);
quickSort(array, pivot + 1, last);
}
}
}
public void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void sort(int [] v){
quickSort(v, 0, v.length - 1);
}
}
下面是用于此操作的插入方法
public class InsertionSort {
public void insertionSort(int [] arr, int first, int last){
for(int i = first + 1; i<last ; i++){
int temp;
int j = i;
while(j > first && arr[j-1] > arr[j]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
j--;
}
}
}
public void sort(int[] v){
insertionSort(v, 0, v.length);
}
所以问题是它不能正常工作,当我尝试使用不同大小和不同类型的数据(排序数组, Shuffle 数组,随机)的数组时,它并不总是工作。我的意思是它不能正确地对数组进行排序。例如,它不能对 Shuffle 数组或随机数组进行排序。下面是一个例子:
[001 pdf 1st-31files][001 pdf 1st-31files][001 pdf 1st-31files][001 pdf 1st-31files]
这是打印的排序版本:
[1,1,2,2,3,4,13,35,75,124,234,242,53,332,3563,4646,646]
有人能帮我解决这个问题吗?我已经检查了我的插入方法和快速排序算法(分区方法)工作得很好,所以问题必须在快速排序方法中的某个地方。顺便说一句,我看过一些关于堆栈溢出的类似帖子,但没有一个在我的情况下有效。我尝试过的一个技巧效果更好,但它不一致。当涉及到偶数和奇数数组时,当使用随机数据时,它有时有效,有时无效。
先谢了!
1条答案
按热度按时间ukdjmx9f1#
这个很经典差一错误。让我们看看你的两个排序器类:
看到区别了吗?
-1
?这不是错误所在,但这给了我们一个提示,这里有什么问题:你的last
参数意味着两件不同的事情!在快速排序的情况下,它是最后一个要排序的元素的索引,在InsertionSort的情况下,它是最后一个要排序的元素的 * 一个过去 *。现在看看当QuickSort调用InsertionSort时会发生什么:
您需要从一种约定转换到另一种约定,因此最后一个参数需要是
last+1
。