forked from ulysses4ever/cs211-arrays
/
quick_sort.cpp
31 lines (28 loc) · 1.32 KB
/
quick_sort.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstdlib>
#include "quick_sort.h"
using std::rand;
using std::swap;
// pivot - "опорный" элемент
// partition - переупорядочивает элементы части массива,
// заданной отрезком [left, right), так что в начале
// следуют элементы меньшие pivot, а в конце - большие;
// возвращает место начала блока элементов, больших pivot;
int * partition(int * left, int * right, int * pivot) {
int * store = left; // место для вставки элементов, меньших pivot
int val = *pivot; // сохранение значения
swap(*pivot, *right); // меняем местами опорный и крайний правый элементы
for (int * p = left; p != right; ++p)
if (*p < val)
swap(*p, *store++);
swap(*store, *right);
return store;
}
void my_qsort(int * arr, int n) {
if (n <= 1)
return; // массив в 1 или 0 элементов уже упорядочен
int * pivotPtr = arr + rand() % n; // случайный выбор опорного элемента
int newPivotIdx = partition(arr, arr + n - 1, pivotPtr) - arr;
my_qsort(arr, newPivotIdx);
my_qsort(arr + newPivotIdx + 1, n - (newPivotIdx + 1));
}