数组C ++中的Quicksort

时间:2014-04-07 01:42:52

标签: c++ quicksort

我正在尝试使用代码中显示的quicksort算法对数组进行分区。我相信问题出在while循环中。你能看到/解释我做错了什么以及我应该做些什么来解决它?谢谢!

编辑,因为我发布了早期版本的代码。

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int intArray[10];
int sizeArray= 10;

int main(){

srand(time(0));
    for(int i = 0; i < sizeArray; i++){
      //random numbers from 1 to 10:
      intArray[i] = rand() % 100 + 1;
   }

   for(int i = 0; i < sizeArray; i++){
      cout << intArray[i] << " ";
   }

int *pivot = &intArray[0];
int *first = &intArray[1];
int *last = &intArray[9];


cout<<"pivot "<<*pivot <<endl;


while(first<last)
{
    while(*first<*pivot)
    {
        first++;

    }
    while(*last>*pivot)
    {
        last--;
    }
    if(*first>*last)
    {
        int aSwap = 0;
        aSwap = *first;
        *first = *last;
        *last = aSwap;

    }

    if((first-1) > last)
        break;


}

        int bSwap=0;
        bSwap = *first;
        *first= *pivot;
        *pivot = bSwap;


    cout<<"After partition"<<endl;
   for(int i = 0; i < sizeArray; i++){
      cout << intArray[i] << " ";
   }


}

2 个答案:

答案 0 :(得分:1)

我会立即给你一个建议:

while(*first<*pivot)

如果array[0]处的数据透视表是数组中的最大值,那么您将在数组末尾运行并继续运行,从而导致未定义的行为。

该循环的终止条件应包括检测first 指针是否已到达last

同样减少last的循环。

当然,一旦指针相遇,就没有必要进行交换了。


您的编辑比较第一个值和最后一个值实际上更糟糕。你应该寻找两个值,你将从最终转向的地方交换。

我建议还原代码,只需添加我建议的限制检查。以下是用于执行分区交换操作的正确的代码,来自我很久以前编写的一些代码:

// Simplest form of pivot selection.

pvt = 0;
lft = 1;
rgt = 9;

// Continue until new pivot point found.

while (lft < rgt) {
    // find value on left greater than pivot value.

    while ((lft < rgt) && (array[lft] <= array[0]))
        lft++;

    // Then, assuming found, find value on right less than pivot value.

    if (lft < rgt) {
        while ((lft < rgt) && (array[rgt] >= array[0]))
            rgt--;

        // Swap them if found.

        if (lft < rgt)
            SWAP (array[lft], array[rgt]);
    }
}

// Back up to find proper swap point for pivot value, then swap.

while ((lft > 0) && (array[lft] >= array[0]))
    lft--;

if (lft != 0)
    SWAP (array[lft], array[0]);

// Now everything left of pivot is less than pivot value, everything
// right is greater/equal. Go and sort the two sections.

答案 1 :(得分:1)

你的生活太复杂了。

GCC 4.7.3:g ++ -Wall -Wextra main.cpp

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int intArray[10];
int sizeArray= 10;

int main() {
  srand(time(0));
  for (int i = 0; i < sizeArray; ++i) {
    //random numbers from 1 to 10:
    intArray[i] = rand() % 100 + 1; }

  for(int i = 0; i < sizeArray; ++i){
    cout << intArray[i] << " "; }

  int* pivot = &intArray[0];

  cout << "pivot " << *pivot << endl;

  for (int i = 0; i < sizeArray; ++i) {
    if (intArray[i] < *pivot) {
      std::swap(intArray[i], *(pivot + 1)); // move the pivot ahead one
      std::swap(*pivot, *(pivot + 1)); // move the value into the hole
      ++pivot; }}

  cout<<"After partition"<<endl;
  for (int i = 0; i < sizeArray; i++){
    cout << intArray[i] << " "; }

  return 0; }