Pagini recente » Cod sursa (job #2255716) | Cod sursa (job #3279107) | Cod sursa (job #2605435) | Cod sursa (job #3264011) | Cod sursa (job #3179783)
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> pii;
pii partition(vector<int> &a, int l, int r)
{
int sz = (r - l + 1);
int m = l + rand() % sz;
int item_m = a[m];
int cnt_l = 0, cnt_b = 0;
for (int i = l; i <= r; i++)
if (a[i] < item_m) cnt_l++; else
if (a[i] > item_m) cnt_b++;
int x = l;
int y = r;
while (true)
{
// look for a[x] >= item_m
while (x <= r && a[x] < item_m) x++;
// look for a[y] <= item_m
while (y >= l && a[y] > item_m) y--;
if (x >= y) break;
swap(a[x], a[y]);
}
return { l + cnt_l, r - cnt_b };
}
void quicksort(vector<int> &a, int l, int r)
{
if (l >= r) return;
pii pivot = partition(a, l, r);
quicksort(a, l, pivot.first - 1);
quicksort(a, pivot.second + 1, r);
}
int main()
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
int n;
cin >> n;
vector <int> in(n);
for (int i = 0; i < n; i++) cin >> in[i];
quicksort(in, 0, (int)in.size() - 1);
for (auto item: in) cout << item << ' ';
return 0;
}