当分区大小低于某个阈值(使用下面的10)时,尝试使用quickSort对具有插入排序的混合quickSort进行编码。我似乎无法让它工作。数组总是会返回一些乱序的数字。
这是我的部分代码:
public static void quickSort(int[] list) {
quickSort(list, 0, list.length - 1);
}
private static void quickSort(int[] list, int first, int last) {
int size = (last+1) - first;
if (size <= 10){ // insertion sort if 10 or smaller
insertionSort(list, first, size);
}
else // quicksort if large
{
int pivotIndex = partition(list, first, last);
quickSort(list, first, pivotIndex - 1);
quickSort(list, pivotIndex + 1, last);
}
}
public static void insertionSort(int[] list, int first, int size) {
for (int i = first+1; i < size; i++) {
int currentElement = list[i];
int k;
for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
list[k + 1] = list[k];
}
// Insert the current element into list[k+1]
list[k + 1] = currentElement;
}
}
预期输出:随机数组按升序排序。
样品输出包含错误:9 18 34 36 53 61 87 89 117 115 109 120 129 154 163 136 131 164 175 193 206 182 259 243 181 165 216 261 274 276 281 320 338 341 322 322 379 372 382 392 397 419 401 402 479 508 512 494 518 558 578 588 606 660 657 665 617 674 698 728 683 692 684 685 737 738 741 745 753 777 799 816 824 791 807 823 762 761 825 845 833 854 860 934 886 933 880 864 879 915 939 970 948 972 952 953 945 968 977 995
答案 0 :(得分:0)
问题在于您调用插入排序
int size = (last+1) - first;
if (size <= 10){ // insertion sort if 10 or smaller
insertionSort(list, first, size);
}
让我们说在某些时候第一个= 5和最后一个= 7然后大小= 2.你最终会调用insertionSort(list,5,2)
然后在你的insertionSort()方法中,你的初始for循环将如下所示:
for (int i = 5+1; i < 2; i++) {
它应该看起来像:
for (int i = 5+1; i < 7; i++) {
我没有测试它,但看起来这就是问题。
答案 1 :(得分:0)
通过更改以下内容使其成功:
private static void quickSort(int[] list, int first, int last) {
int size = (last +1) - first;
if (first < last){
if (last < 11){ // insertion sort if 10 or smaller
insertionSort(list, first, size);
}
else // quicksort if large
{
int pivotIndex = partition(list, first, last);
quickSort(list, first, pivotIndex - 1);
quickSort(list, pivotIndex + 1, last);
}
}
}
答案 2 :(得分:0)
我无法发表评论,因为我还没有50名代表。我认为你的解决方案不会像你想象的那样工作。您将最终仅在前10个元素上运行插入排序。
返回初始代码并将您的调用更改为insertedSort(list,first,size); to:insertionSort(list,first,last);
答案 3 :(得分:0)
好的,我做了这个工作......
第一种改变方法quickSort:
private static void quickSort(int[] list, int first, int last) {
int size = (last+1) - first;
if (first < last){
if (size <= 10){
insertionSort(list, first, last); //Changed this line
}
else{
int pivotIndex = partition(list, first, last);
quickSort(list, first, pivotIndex); //Changed this line just because i used the partition method from Hoare and not Lomuto
quickSort(list, pivotIndex + 1, last);
}
}
}
然后在方法insertSort:
public static void insertionSort(int[] list, int first, int last) {
for (int i = first+1; i <= last; i++) { // Change i <= last
int currentElement = list[i];
int j = i-1;
while (j>=0 && list[j]>currentElement) {
list[j+1] = list[j];
j--;
}
list[j+1] = currentElement;
}
}
希望是你想要的答案。