Pagini recente » Cod sursa (job #1390282) | Cod sursa (job #154262) | Cod sursa (job #2480563) | Cod sursa (job #2501413) | Cod sursa (job #1379861)
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#define NMAX 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
vector <int> v, a;
void mergesort(int st, int dr);
int main()
{
int n;
fin >> n;
v.reserve(n + 2);
a.reserve(n + 2);
for (int i = 0; i < n; ++i)
fin >> v[i];
mergesort(0, n - 1);
for (int i = 0; i < n; ++i)
fout << v[i] << ' ';
fout << '\n';
return 0;
}
void mergesort(int st, int dr)
{
if (st >= dr) return;
if (st == dr - 1)
{
if (v[st] > v[dr]) swap(v[st], v[dr]);
return;
}
int mij = st + ((dr - st) >> 1);
mergesort(st, mij);
mergesort(mij + 1, dr);
merge(v.begin() + st, v.begin() + mij + 1, v.begin() + mij + 1, v.begin() + dr + 1, a.begin());
copy(a.begin(), a.begin() + dr - st + 1, v.begin() + st);
/*
int i = st, j = mij + 1, k = -1;
while(i <= mij && j <= dr)
{
if (v[i] < v[j]) a[++k] = v[i++];
else a[++k] = v[j++];
}
if (i <= mij) memcpy(a + k + 1, v + i, (mij - i + 1) * sizeof(int));
else if (j <= dr) memcpy(a + k + 1, v + j, (dr - j + 1) * sizeof(int));
memcpy(v + st, a, (dr - st + 1) * sizeof(int));
*/
}