使用quicksort排序不会给出排序数组

时间:2015-08-01 07:22:20

标签: c++ sorting quicksort

我开始在C++中学习算法并坚持使用Quicksort。但是我无法在我的代码中得到没有正确排序数组的错误。

以下是code的链接或以下是代码:

#include <iostream>
using namespace std;

void printArray(int array[], int len) {
  for (int i = 0; i < len; i++) {
    cout << array[i] << " ";
  }
  cout << endl;
}

void swap(int* a, int *b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}

int partition(int arr[], int lo, int hi) {
  int pivot = arr[hi];
  int i = lo - 1;
  for (int j = lo; j < hi-1; j++) {
    if (arr[j] <= pivot) {
        i +=1;
        swap(&arr[i], &arr[j]);
    }
  }

  swap(&arr[i+1], &arr[hi]);
  return i+1;
  }

  void quicksort(int arr[], int lo, int hi) {
    if (lo < hi) {
      int p = partition(arr, lo, hi);
      quicksort(arr, lo, p-1 );
      printArray(arr, 8);
      quicksort(arr, p + 1, hi);
    }
  }

 int main() {
   int len;
   int array[] = {2,8,7,1,3,5,6,4};
   len = (sizeof(array)/sizeof(array[0]));
   quicksort(array, 0, len-1);
   printArray(array, len);
   return 0;
 }

我正在打印数组元素,以便我可以看到数组元素的行为。

2 个答案:

答案 0 :(得分:2)

您的实现看起来非常接近Wikipedia上的伪代码(代码中的j中的partition(..)在维基百科文章中被称为i i在您的代码中,名称为storeIndex

但是有两个不同之处,其中一个至少导致算法在你的例子中失败:

for (int j = lo; j < hi-1; j++)

应该是

for (int j = lo; j <= hi-1; j++)

维基百科文章说for i from lo to hi−1, inclusive因此<=代替<

另一个区别是你的代码中有

if (arr[j] <= pivot)

而维基百科的文章有

if A[i] < pivotValue

所以<代替<=

答案 1 :(得分:1)

请更改for循环:

for (int j = lo; j < hi-1; j++)

for (int j = lo; j < hi; j++) 

for (int j = lo; j <= hi-1; j++)

必须从lohi包含)处理数组的原因。

但是,在你的尝试中它只采取

  

{lo,low + 1,...,hi-1}

而不是

  

{lo,low + 1,...,hi-1, hi }