500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误

Posted

技术标签:

【中文标题】500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误【英文标题】:Seg Fault in c++ quicksort algorithm on array of 500,000 sorted integers 【发布时间】:2015-02-13 18:38:10 【问题描述】:

我的 C++ 中的快速排序算法有问题。我在 3 个不同的输入文件上运行,每个文件有 500,000 个整数。第 1 次和第 3 次按应有的方式运行,而第 2 次导致段错误。第一个有 500,000 个未排序的整数,第二个有 500,000 个排序的整数,第三个有 500,000 个倒序排序的整数。我在这里上传了第二个输入文件:http://s000.tinyupload.com/index.php?file_id=43088934371978831513

    #include <iostream>
#include <time.h>

using namespace std;

int unsorted[500010];
int low = 0;
int high = 500000;
int y = 0;
int x  = 0;
int pivot = 0;
void read()

    int x;
    for (x = 1; x <= 500001; x++)
    
        cin>>unsorted[x];
    


void printOut()

    int x;
    for (x = 1; x <= 500000; x++)
    
        //cout<<unsorted[x]<<endl;
        if (unsorted[x - 1] > unsorted[x])
        
            cout<<"This list is not sorted!"<<endl;
            return;
        
    
    cout<<"This list is sorted!"<<endl;


int median(int left, int right)

    int middle = (right / 2);
    if(unsorted[left] > unsorted[middle] && unsorted[left] < unsorted[right])
        return left;
    else if(unsorted[middle] > unsorted[left] && unsorted[middle] < unsorted[right])
        return middle;
    else if(unsorted[right] > unsorted[middle] && unsorted[right] < unsorted[left])
        return right;

    if(unsorted[left] < unsorted[middle] && unsorted[left] > unsorted[right])
        return left;
    else if(unsorted[middle] < unsorted[left] && unsorted[middle] > unsorted[right])
        return middle;
    else if(unsorted[right] < unsorted[middle] && unsorted[right] > unsorted[left])
        return right;
    else
        return left;


void intSwap(int a,int b)

    //cout<<"intSwap::   "<<"low: "<<low<<" high: "<<high<<endl;
    int tmp;
    tmp = unsorted[a];
    unsorted[a] = unsorted[b];
    unsorted[b] = tmp;


int partition(int low, int high)

    //cout<<"partition:: "<<"low: "<<low<<" high: "<<high<<endl;
    x = 0;
    pivot = median(low,high);
    int pivotValue = unsorted[pivot];

    //intSwap(median(low,high),high);
    intSwap(pivot,high);

    int index = low;

    for (x = low; x < high; x++)
    
        //cout<<"ONE"<<endl;

        if (unsorted[x] <= pivotValue)
        //if (unsorted[x] <= unsorted[index])
        
            //cout<<"TWO"<<endl;
            intSwap(x, index);
            index += 1;
            //cout<<"THREE"<<endl;
        
    
    //cout<<"FOUR"<<endl;
    intSwap(index,high);

    //cout<<"index:: "<<index<<endl;
    return index;



void quicksort(int low, int high)

    //cout<<"quicksort:: "<<"low: "<<low<<" high: "<<high<<endl;
    int p;
    if (low < high) //else, we're at the end
    
        p = partition(low, high);
        quicksort(low, p - 1);
        quicksort(p + 1, high);
    


int main()

    read();
    cout<<"read complete"<<endl;

    clock_t t = clock();
    quicksort(1,500000);
    t = clock() - t;
    printOut();
    cout<<"It took me "<<t<<" clicks ("<<((float)t/CLOCKS_PER_SEC)<<" seconds)"<<endl;
    //partition();
    //cout<<unsorted[median(0,500000)]<<endl;
    //quicksort();

gdb 告诉我程序在这里出现了段错误:

Program received signal SIGSEGV, Segmentation fault.
0x08048984 in partition (low=424752, high=500000)
at quicksort.cpp:69
69          pivot = median(low,high);

如果有人能在这里帮我一把,我将不胜感激!请注意,该算法可能需要几分钟才能运行!

【问题讨论】:

如果您的快速排序实现在具有500,000 整数的数组上运行了几分钟,那么它肯定有问题。 a) 摆脱全局变量 先问你的调试器怎么样? 【参考方案1】:

有一点看起来很奇怪的是这条线:

int middle = (right / 2);

这并不总是返回左右之间的元素。

或许可以试试:

int middle = left + ( (right-left) / 2);

当前代码可能会产生一个不会减少数组长度的枢轴值,因此最终会导致无限递归,当所有堆栈空间用完时最终会崩溃。

【讨论】:

非常感谢您的快速回复!就是这样!

以上是关于500,000 个已排序整数数组上的 C++ 快速排序算法中的 Seg 错误的主要内容,如果未能解决你的问题,请参考以下文章

大桌子的快速排序出奇地慢

精选力扣500题 第6题 LeetCode 912. 排序数组c++详细题解

精选力扣500题 第15题 LeetCode 33. 搜索旋转排序数组c++详细题解

带有矢量对象 C++ 的快速排序函数

Day4-快速排序和反转整数

C++ - 仅使用无符号整数实现快速排序?