如何正确实施Quicksort?

时间:2019-04-22 16:58:14

标签: c++ quicksort

我正在尝试实现快速排序,但我正在按照书中的步骤进行操作,但我不知道应如何实现三位数的中位数。我遵循了书中的说明,但我不明白为什么三个位数的中位数实际上会有所帮助?我从来没有真正做任何事情。

这是我的实现方式:

Herer是我的Quicksort实现。

void QuickSort::QuickSortM3(std::vector<int> &data, int left, int right){    
    if(left < right){
        pivotM3(data, left, right);
        int i = partition(data, left, right);

        QuickSortM3(data, left, i-1);
        QuickSortM3(data, i +1, right);
    }

}
void QuickSort::pivotM3(std::vector<int> &data,  int left, int right){
    std::swap(data[(left+ right)/2], data[(right -1)]);
    if(data[left] < data[right-1]){
        std::swap(data[left], data[right-1]);
    }
    if(data[left] < data[right]){
        std::swap(data[left], data[right]);
    }
    if(data[right -1] < data[right]){
        std::swap(data[left], data[right-1]);
    }

}
int QuickSort::partition(std::vector<int> &data,  int left, int right){
    int i = left - 1, j = right; int v = data[right];

    for(;;){

        while(data[++i] < v);
        while (v < data[--j]){
            if( j == left) {
            break;
            }
        } 
        if(i >= j) break;
        std::swap(data[i], data[j]);        
    }
    std::swap(data[i], data[right]);
    return i;
}

我的实际意思是,我不应该在分区中使用中间元素吗? 任何帮助都会很棒,谢谢。

1 个答案:

答案 0 :(得分:1)

使用中位数3的Hoare分区方案示例

--reporter-csv-export ./pathName/TestSuite1_Dev.csv