无法完美实现QuickSort

时间:2015-11-18 19:50:39

标签: java arrays algorithm sorting quicksort

我正在尝试在java中编写一个简单的方法,它会对int []执行quicksort,但我会在结果中得到一个不合适的值。

任何帮助,以了解我出错的地方将不胜感激。以下是我的代码:

public static void quickSort(int[] arr, int left, int right){
    if (left < right){
        int p = partition(arr, left, right);
        quickSort(arr, left, p-1);
        quickSort(arr, p+1, right);
    }
}

public static int partition(int[] arr, int left, int right){
    int pivot = arr[left];
    int l = left+1;
    int r = right;
    while (l < r){
        while (l<right && arr[l] < pivot){
            l++;
        }
        while (r>left && arr[r] > pivot){
            r--;
        }
        if (l < r){
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
        }
    }
    arr[left] = arr[r];
    arr[r] = pivot;         
    return r;
}

4 个答案:

答案 0 :(得分:0)

您的代码非常完美,但请确保为方法quickSort提供正确的值。

        int[] arr = .....;
        int left = 0;
        int right = arr.length - 1;

  public static void quickSort(int[] arr, int left, int right){

答案 1 :(得分:0)

这两行是可疑的:

var ss = SpreadsheetApp.create(name, rows, columns); var myNumColumns = ____; //or defined in the function call var newSheet = ss.insertSheet(sheetName, sheetIndex, options); var columnsToDelete = newSheet.getLastColumn() - myNumColumns; newSheet.deleteColumns((myNumColumns-1), columnsToDelete);

quickSort(arr, p+1, right);

当你选择右侧分区时,你是否正在跳过数组的第一个元素?一些示例测试用例及其输出可用于添加。

答案 2 :(得分:0)

我更改了分区方法。我尝试做一些小改动,主要是为了打破循环。

public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int l = left ;
    int r = right+1;
    while (true) {
        while (arr[++l] < pivot) {
            if (l >= right)
                break;
        }
        while (arr[--r] > pivot) {
            if (r <= left)
                break;
        }
        if (l >= r)
            break;
        int temp = arr[l];
        arr[l] = arr[r];
        arr[r] = temp;
    }
    arr[left] = arr[r];
    arr[r] = pivot;
    return r;
}

我测试了下面的场景并且它正在运行。

int[] arr = { 9, 5, 10, 8, 2, 3, 4, 7, 6, 1 };
int[] arr = { 9, 5, 10, 8, 2, 9, 5, 10, 8, 2 };
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));

答案 3 :(得分:0)

Hoare分区方案在快速排序调用中使用p和p + 1。我将一个有效的C程序转换为Java。我将枢轴切换到中间,因此排序或反向排序的数组不是最坏的情况。

public static void quickSort(int[] arr, int left, int right){
    if (left < right){
        int p = partition(arr, left, right);
        quickSort(arr, left, p);
        quickSort(arr, p+1, right);
    }
}

public static int partition(int[] arr, int left, int right){
    int pivot = arr[(left+right)/2];
    int l = left-1;
    int r = right+1;
    while (true){
        while (arr[++l] < pivot);
        while (arr[--r] > pivot);
        if (l >= r)
            break;
        int temp = arr[l];
        arr[l] = arr[r];
        arr[r] = temp;
        }
    }
    return r;
}