java 为什么我的快速排序和插入排序混合算法不能正常工作?

0sgqnhkj  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(127)
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]
有人能帮我解决这个问题吗?我已经检查了我的插入方法和快速排序算法(分区方法)工作得很好,所以问题必须在快速排序方法中的某个地方。顺便说一句,我看过一些关于堆栈溢出的类似帖子,但没有一个在我的情况下有效。我尝试过的一个技巧效果更好,但它不一致。当涉及到偶数和奇数数组时,当使用随机数据时,它有时有效,有时无效。
先谢了!

ukdjmx9f

ukdjmx9f1#

这个很经典差一错误。让我们看看你的两个排序器类:

public class QuicksortFixedPivotInsertion implements IntSorter{
    /* ... */
    private void quickSort(int [] array, int first, int last){
        /* ... */
    }
  
    public void sort(int [] v){
        quickSort(v, 0, v.length - 1);
    }
}
public class InsertionSort {

    public void insertionSort(int [] arr, int first, int last){
        /* ... */
    }

    public void sort(int[] v){
        insertionSort(v, 0, v.length);
    }
}

看到区别了吗?-1?这不是错误所在,但这给了我们一个提示,这里有什么问题:你的last参数意味着两件不同的事情!在快速排序的情况下,它是最后一个要排序的元素的索引,在InsertionSort的情况下,它是最后一个要排序的元素的 * 一个过去 *。
现在看看当QuickSort调用InsertionSort时会发生什么:

insert.insertionSort(array, first, last);

您需要从一种约定转换到另一种约定,因此最后一个参数需要是last+1

相关问题