C++ 快速排序段错误

Posted

技术标签:

【中文标题】C++ 快速排序段错误【英文标题】:C++ Quicksort Seg Fault 【发布时间】:2012-05-23 07:22:23 【问题描述】:

我正在尝试修改快速排序算法,并实现一个随机数的枢轴,从而试图避免 O(n^2) 问题。我想使用一个随机数,但我的代码给出了分段错误。

int random (int num) 
    int random = rand() % (num - 1);
    return random;


int* partition (int* first, int* last);
void quickSort(int* first, int* last) 
    if (last - first <= 1) return;

    int* pivot = partition(first, last);
    quickSort(first, pivot);
    quickSort(pivot + 1, last);


int* partition (int* first, int* last)    
    int* pos = (first + random(last - first));
    int pivot = *pos;
    int* i = first;
    int* j = last - 1;

    for (;;) 
        while (*i < pivot && i < last) i++;
        while (*j >= pivot && j > first) j--;
        if (i >= j) break;
        swap (*i, *j);
    
    swap (pos, i);
    return i;

【问题讨论】:

尝试通常的 (random() % range) 来钳制随机数... 你使用的是哪个调试器? 【参考方案1】:

您的random() 函数生成值超出范围,而不是内部它:

int random (int num) 
    int random = rand();
    while (random > 1 && random < num - 1) 
        random = rand();
    
    return random;

这会导致partition() 在尝试取消引用越界元素时出现段错误。

我的建议是重写random(),并完全避免循环(如果范围很小,循环可能非常昂贵)。

【讨论】:

以上是关于C++ 快速排序段错误的主要内容,如果未能解决你的问题,请参考以下文章

快速排序的 C++ 实现中的运行时错误

在最佳情况下,由于堆栈溢出错误,快速排序算法失败 - C++

C++ 快速排序实现,没有正确的输出

C++ 向量快速排序 - 似乎对不同的枢轴有不同的工作方式

C快速排序(链表)分段错误

c++快速排序算法