C++快速排序算法崩溃

C++ Quicksort Algorithm Crashing

本文关键字:崩溃 算法 快速排序 C++      更新时间:2023-10-16

我正在研究一种 c++ 快速排序算法,该算法计算排序过程中的重要操作数。它将正确排序 100 个值,但之后它会陷入无限循环。任何帮助将不胜感激!

快速排序.cpp

#include "QuickSort.h"
#include <algorithm>
using namespace std;
QuickSort::QuickSort(int max) : SortData(max)
{
    /*
    maxSize = max;
    theData = new long[max];
    */
    SortData::randomize(12);
}
QuickSort::~QuickSort(void)
{
}
_int64 QuickSort:: sort()
{
    numops = 0;
    quicksort(theData, 0, (size()-1));
    return(numops);
}
//Include counting number of operations
void QuickSort::quicksort(long theData[], int left, int right)
{
    //Default variables
    if (size() <= 1 || left >= size() || right >= size()) return; //Bounds checking
    if (left < right)
    {
        long pivot = partition(theData, left, right);
        quicksort(theData, left, pivot-1);
        quicksort(theData, pivot+1, right);
    }
}
int QuickSort::partition(long theData[], int left, int right)
{
    long pivot = theData[left];
    while (true)
    {
        while (theData[left] < pivot) left++;
        numops ++;
        while (theData[right] > pivot) right--;
        numops ++; 
        if (left < right)
        {
            swap(theData[left], theData[right]);
            numops+=3;
        }
        else
        {
            return right;
        }
    }
}
/

/QuickSort.h

#pragma once
#include "SortData.h"
class QuickSort : public SortData
{
public:
    QuickSort(int max = 100);
    ~QuickSort(void);
    _int64 sort();
private:
    _int64 numops;
    void QuickSort::quicksort(long theData[], int left, int right);
    int partition(long theData[], int left, int right);
}; 

在分区函数中

 if (left < right)

总是正确的。因此,你得到了无限的while(true(循环。

并且 SortData.h 中的 size(( 函数可能存在问题,我们还看不到。

由于数据是随机的,因此您不时在某些输入集上看到问题。

轻微的修改必须有所帮助:

if (left <= right) {
         if (left < right) {
             swap(theData[left], theData[right]);
             numops += 3;
         }
         left++;
         right--;
}
else {
    return right;
}

抱歉仔细检查:)

如果left < righttheData[left] == theData[right]partition就会卡住。