C ++快速排序算法崩溃[关闭]

Posted

技术标签:

【中文标题】C ++快速排序算法崩溃[关闭]【英文标题】:C++ Quicksort Algorithm Crashing [closed] 【发布时间】:2012-05-22 20:04:04 【问题描述】:

我正在研究一种 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;
        
    

//快速排序.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);
; 

【问题讨论】:

SortData 是什么样的?它实际上是在构造函数中分配一个最大大小的数组吗? 您的partition 函数看起来如果找到两个等于枢轴的元素,它将进入无限循环(我可能弄错了,没有仔细研究您的代码)。如果这不是家庭作业,请使用std::partition 另请注意,您的numops 跳过了很多分区逻辑。 这里是 sortdata 的要点gist.github.com/2771303 numops 应该只计算排序中重要操作的数量。 【参考方案1】:

在你的分区函数中

 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 不断增加,right 不断减少,当他们相遇时它就停止了。 @Mooing Duck:……说的基本一样【参考方案2】:

如果left &lt; righttheData[left] == theData[right]partition 会卡住。

【讨论】:

那么解决这个问题的最简单方法是什么? @user1411112:请参阅我为您的角盒添加的内容

以上是关于C ++快速排序算法崩溃[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C语言,快速排序算法

数据结构之八大排序算法(C语言实现)

排序算法 | 快速排序(含C++/Python代码实现)

c语言快速排序算法

用C语言编写函数,要实现快速排序算法或者冒泡法

C语言编程入门笔记基础学习排序算法之快速排序,轻松掌握快排!