【问题标题】:c++ QuickSort not clearc++ QuickSort不清楚
【发布时间】:2013-02-28 12:32:59
【问题描述】:

我正在尝试了解快速排序机制,但到目前为止我无法弄清楚。根据维基百科,步骤是:

1. 从列表中选择一个元素,称为枢轴。

2. 重新排序列表,使所有值小于枢轴的元素都在枢轴之前,而所有值大于枢轴的元素都在它之后(相等的值可以去任何一种方式) .在此分区之后,枢轴处于其最终位置。这称为分区操作。

3.将上述步骤递归地应用于具有较小值的元素的子列表和具有较大值的元素的子列表。

这是代码:

 int partition(int arr[], int left, int right)
    {
          int i = left, j = right;
          int tmp;
          int pivot = arr[(left + right) / 2];

          while (i <= j) {

                while (arr[i] < pivot)
                      i++;
                while (arr[j] > pivot)
                      j--;
                if (i <= j) {
                      tmp = arr[i];
                      arr[i] = arr[j];
                      arr[j] = tmp;
                      i++;
                      j--;
                }
          }
          return i;
    }
     void quickSort(int arr[], int left, int right) {
          int index = partition(arr, left, right);
          if (left < index - 1)
                quickSort(arr, left, index - 1);
          if (index < right)
                quickSort(arr, index, right);
    }

除了一件事,我都清楚了。为什么分区函数返回i而不是j

【问题讨论】:

  • 它可以返回任何一个,具体取决于您将枢轴放入哪个组。
  • 如果我把return j;而不是return i;,对于数组{3,2,4,1}程序崩溃
  • @Theo.:那是因为您拥有的quickSort 函数期望partition 返回第二个分区的第一个元素的索引。将其更改为期望最后一个元素的索引将是一个非常微不足道的更改。
  • 是的,我就是这么想的,但为什么我找不到任何其他不返回第二个分区中第一个元素的索引的 quickSort 示例?
  • @Theo。 “我在电视上看过,应该是真的。” - 并非所有可能的程序的所有可能的正确实现都已编写(还)。

标签: c++ sorting quicksort


【解决方案1】:

我找到了这个程序(和输出)here。看看吧,

#include <iostream>
using namespace std;

const int INPUT_SIZE = 10;

// A simple print function
void print(int *input)
{
    for ( int i = 0; i < INPUT_SIZE; i++ )
        cout << input[i] << " ";
    cout << endl;
}

// The partition function
int partition(int* input, int p, int r)
{
    int pivot = input[r];

    while ( p < r )
    {
        while ( input[p] < pivot )
            p++;

        while ( input[r] > pivot )
            r--;

        if ( input[p] == input[r] )
            p++;
        else if ( p < r )
        {
            int tmp = input[p];
            input[p] = input[r];
            input[r] = tmp;
        }
    }

    return r;
}

// The quicksort recursive function
void quicksort(int* input, int p, int r)
{
    if ( p < r )
    {
        int j = partition(input, p, r);        
        quicksort(input, p, j-1);
        quicksort(input, j+1, r);
    }
}

int main()
{
    int input[INPUT_SIZE] = {500, 700, 800, 100, 300, 200, 900, 400, 1000, 600};
    cout << "Input: ";
    print(input);
    quicksort(input, 0, 9);
    cout << "Output: ";
    print(input);
    return 0;
}

OUTPUT:-
Input: 500 700 800 100 300 200 900 400 1000 600
Output: 100 200 300 400 500 600 700 800 900 1000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多