双枢轴QuickSort

时间:2019-03-15 09:59:09

标签: java sorting quicksort

因此,我正在研究一个使用三个分区实现QuickSort的问题,选择数组的最左侧和最右侧的元素作为枢轴。我的函数基本上从数组的左侧和右侧进行lomoto分区。该算法基本上可以对95%的情况对数组进行排序,但是有一些对它不起作用。有人知道为什么吗?

public static int[] partition2Pivots(int[] arr, int p, int r) {

    if(arr[p]>arr[r]) {
        int temp = arr[p];
        arr[p] = arr[r];
        arr[r] = temp;
    }

    int pivotLow = arr[p];
    int pivotHigh = arr[r];

    int low = p;
    int high = r;

    for(int j=p; j<=r; j++) {
        if(arr[j]>pivotHigh) {
            high--;
            int temp = arr[j];
            arr[j] = arr[high];
            arr[high] = temp;
        }
        if(arr[j]<pivotLow) {
            low++;
            int temp = arr[j];
            arr[j] = arr[low];
            arr[low] = temp;
        }
    }
    int temp1 = arr[p];
    arr[p] = arr[low];
    arr[low] = temp1;
    int temp2 = arr[r];
    arr[r] = arr[high];
    arr[high] = temp2;

    int pivots[] = {low, high};
    return pivots;
}
public static void quickSort2Pivots(int[] arr, int p, int r) {
    if(p<r) {
        int[] pivots = partition2Pivots(arr, p, r);
        quickSort2Pivots(arr, p, pivots[0]);
        quickSort2Pivots(arr, pivots[0]+1, pivots[1]-1);
        quickSort2Pivots(arr, pivots[1], r);
    }
}

1 个答案:

答案 0 :(得分:0)

可能的故障点是两个枢轴使用相同的回路。或者可能是p的低位和r的高位的最终交换是多余的,因为循环已经从p到r都开始了。

但是首先,给出一个失败案例的示例,并尽可能地减少失败。

此外,如果将用于交换两个数组元素的代码封装在函数swap(arr,i,j)中,则可以节省大量代码以及潜在的错误。