这个QuickSort有什么问题,我在书中提到它

时间:2015-10-29 17:01:52

标签: c++ quicksort

我编写了一个程序,包含QuickSort来对包含在向量中的一些数据进行排序

我参考了.-- Mark Allen Weiss,但当我在VS2015&& amp; G ++ 4.8,编程失败。

只有我确定我的程序的其他部分是正确的。 一些数据生成,并将它们读取到矢量 (比较QuickSort和MergeSort之间的属性,而MergeSort在文本时顺利进行)

void QuickSort(vector<int> &a) {
    QuickSort(a, 0, a.size() - 1);
}

int median3(vector<int> &a, int left, int right) {
    int mid = (left + right) >> 1;
    if (a[mid] < a[left])
        swap(a[left], a[mid]);
    if (a[right] < a[left])
        swap(a[left], a[right]);
    if (a[right] < a[mid])
        swap(a[mid], a[right]);
    swap(a[mid], a[right - 1]);
    return a[right - 1];
}
void QuickSort(vector<int> &a, int left, int right) {
    //if (left + 10 <= right) {
        int pivot = median3(a, left, right);

        // begin partitioning
        int i = left, j = right -1;
        for ( ; ; ) {
            while (a[++i] < pivot){ }
            while (pivot  < a[--j]){ }
            if (i < j)
                swap(a[i], a[j]);
            else break;
        }
        swap(a[i], a[right - 1]);   // restore pivot

        QuickSort(a, left, i - 1);  // store small element
        QuickSort(a, i + 1, right); // store large element
    // }
    // else
    //     InsertionSort(a, left, right);
}

在VS&amp;&amp;中编译成功G ++,而VS givin警告:   函数可能会导致运行时堆栈溢出

我困惑了两天,太伤心了。 。 。

1 个答案:

答案 0 :(得分:0)

在将public ThreadSafePainter() { ... synchronized (this) { this.dataList = getUpdatedData(); } ... } public void onPaint(Graphics2D g) { ... synchronized (this) { for (String data : dataList) ... } } 传递给right之前,您需要确保left大于QuickSort(a, left, right)。否则,当您尝试访问a[]时,该位置可能会超出范围。

此外,您无需在median3中将支点交换到最后,然后在QuickSort中“恢复”它。只需让你的ij索引从向量的两端开始,然后将小于数据透视的数字与大于数据透视的数字交换。

void QuickSort(vector<int> &a, int left, int right) {

    int pivot = a[(left + right) / 2];

    // begin partitioning
    int i = left, j = right;
    for ( ; ;) {
        while (a[i] < pivot){ ++i; }
        while (pivot < a[j]){ --j; }
        if (i < j){
            swap(a[i], a[j]);
        }
        else break;
    }

    if (left < i-1) QuickSort(a, left, i - 1);  // store small element
    if (i+1 < right) QuickSort(a, i + 1, right); // store large element
}