Я пытаюсь реализовать быструю сортировку, выполняю шаги в своей книге и не понимаю, как следует реализовать медиану из трех. Я следовал инструкциям из книги, но не понимаю, почему медиана из трех на самом деле помогает? На самом деле я никогда ничего с этим не делаю.
Вот моя реализация:
Вот моя реализация 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;
}
На самом деле я имею в виду, не должен ли я использовать средний элемент в разбиении? Любая помощь будет здорово, спасибо.
«Как мне правильно реализовать Quicksort?» - звоните std::sort ?
Этот пост должен прояснить. stackoverflow.com/questions/164163/quicksort-choosing-the-pivot
@JesperJuhl это было бы неправильно, так как std::sort не реализует быструю сортировку.
@SergeyA достаточно честно. Но он по-прежнему соответствует конечной цели сортировки контейнера.
@Cubic Нет, медиана трех - это не только термин из моей книги. Это своего рода быстрая сортировка, когда вы выбираете первый, средний и последний элемент и меняете их местами.





Пример схемы разделения Хоара с использованием медианы 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);
}
Что вы имеете в виду под "медианой из трех"? Это какой-то термин из вашей книги? Я не читал вашу книгу.