Как правильно реализовать Quicksort? - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь реализовать быструю сортировку, и я следую инструкциям в своей книге, и я не понимаю, как следует реализовать медиану из трех. Я следовал инструкциям книги, но я не понимаю, почему медиана из трех на самом деле помогает? Я никогда ничего с этим не делаю.

Вот моя реализация:

Здесь моя реализация 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 Ответ

1 голос
/ 22 апреля 2019

Пример схемы разбиения Hoare с использованием медианы 3:

void QuickSort(int a[], int lo, int hi)
{
    if(lo >= hi)
        return;
    int md = lo+(hi-lo)/2;      // median of 3
    if(a[lo] > a[hi])
        std::swap(a[lo], a[hi]);
    if(a[lo] > a[md])
        std::swap(a[lo], a[md]);
    if(a[md] > a[hi])
        std::swap(a[md], a[hi]);
    int v = a[md];              // partition
    int i = lo - 1;
    int j = hi + 1;
    while(1)
    {
        while(a[++i] < v);
        while(a[--j] > v);
        if(i >= j)
            break;
        std::swap(a[i], a[j]);
    }
    QuickSort(a, lo, j);
    QuickSort(a, j+1, hi);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...