【问题标题】:QuickSort descending order快速排序降序
【发布时间】:2018-11-08 01:25:15
【问题描述】:

我正在尝试按降序实现快速排序。我试图追踪我的代码,看看为什么它只是部分排序。我的输入是一个 int 数组:{3,4,6,1,9,7}。排序后得到{9,4,7,6,3,1},其中4的位置不对。

    public int partition(int arr[], int left, int right)
    {
       int pivot = arr[right];
       int i = left - 1;
       for(int j = right; j >= left; j--)
    {
        if (arr[j] > pivot)
        {
            i = i + 1;                                      
            int temp = arr[i];
            arr[i]= arr[j];
            arr[j]= temp;
        }
    }

    int temp = arr[i+1];
    arr[i+1] = arr[right];
    arr[right] = temp;

    return i + 1;

    }

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

【问题讨论】:

  • 你可以看到快速排序实现的例子here它包括逻辑和代码示例的解释。
  • 对于这样的问题,拿笔和纸并明确地写下你的算法在做什么是非常有用的,你最终会看到发生了什么。
  • 这是一种分区方式。这不是一种排序方法。排序方法在哪里?
  • @LouisWasserman 请查看更新后的帖子,我已经跟踪了我的代码但仍然不明白。

标签: java quicksort


【解决方案1】:

您的代码应如下所示:

public int partition(int arr[], int left, int right){
    int pivot = arr[left];
    int i = left;
    for(int j = left + 1; j <= right; j++){
        if (arr[j] > pivot){
            i = i + 1;
            int temp = arr[i];
            arr[i]= arr[j];
            arr[j]= temp;
        }
    }

    int temp = arr[i];
    arr[i] = arr[left];
    arr[left] = temp;

    return i;

}

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

【讨论】:

  • 这不是使枢轴成为数组中最左边的元素吗?是否可以将最右边的元素设为枢轴并且仍然按降序排列?
  • 您需要这样做吗?正如我在您的尝试中看到的那样,仅仅因为您应该按降序对其进行排序,并不意味着您应该反转每个操作(左转右,从右开始而不是从左开始......)
  • 不,但我想知道为什么用最左边的元素而不是右边的元素更容易,因为我见过的大多数快速排序算法都使用数组中的最后一个元素。跨度>
  • 实际上恰恰相反,Hoare 的分区(Quicksort 的创建者)将第一个元素作为枢轴,这种方法被广泛使用。
【解决方案2】:

您的方法是正确的,但需要一些修改 查看以下代码以更正您的结果。

public static void quickSort(int[] ar, int start, int end) {
    if (start <end) {
        int p = partition(ar, start, end);
        quickSort(ar, start, p-1);
        quickSort(ar, p+1, end);
    }
}

public static int partition(int[] ar, int start, int end) {
    int pivot = ar[end];
    int i = start;
    for (int j = end; j>= start; j--) {
        if (ar[j] > pivot) {
            int temp1 = ar[i];
            ar[i] = ar[j];
            ar[j] = temp1;
            
            i = i+1;
        }
    }
    int temp2 = ar[i];
    ar[i] = ar[end];
    ar[end] = temp2;
    return i;
}

【讨论】: