在数组C++中快速排序

Quicksort in an array C++

本文关键字:快速排序 C++ 数组      更新时间:2023-10-16

我正在尝试使用代码中显示的快速排序算法对数组进行分区。我相信问题出在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] << " ";
   }

}

我会给你一个直接的建议:

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.

你让你的生活太复杂了。

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; }