Pagini recente » Cod sursa (job #3125251) | Cod sursa (job #2688885) | Cod sursa (job #2452737) | Cod sursa (job #2093681) | Cod sursa (job #1452397)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f
const char IN[] = "algsort.in", OUT[] = "algsort.out";
const int NMAX = 500000;
using namespace std;
int V[NMAX];
int N;
inline void vswap(int i, int j) {
if (&V[i] == &V[j]) return;
V[i] = V[i] ^ V[j];
V[j] = V[j] ^ V[i];
V[i] = V[i] ^ V[j];
}
inline void read_data() {
freopen(IN, "r", stdin);
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%d", &V[i]);
}
fclose(stdin);
}
inline void merge(int low, int m, int high) {
int *L = new int[m - low + 2];
L[m - low + 1] = INF;
int *R = new int[high - m + 1];
R[high - m] = INF;
memcpy(L, V + low , (m - low + 1) * sizeof(int));
memcpy(R, V + (m + 1), (high - m) * sizeof(int));
int i = 0, j = 0;
int k = low;
while (k <= high) {
if (L[i] < R[j]) V[k++] = L[i++];
else V[k++] = R[j++];
}
delete[] L;
delete[] R;
}
void merge_sort(int low, int high) {
if (low == high - 1) {
if (V[low] > V[high]) vswap(low, high);
return;
}
if (low == high) return;
int m = low + ((high - low) >> 1);
merge_sort(low, m);
merge_sort(m + 1, high);
merge(low, m, high);
}
int main() {
read_data();
merge_sort(0, N-1);
freopen(OUT, "w", stdout);
for (int i = 0; i < N; ++i)
printf("%d ", V[i]);
printf("\n");
fclose(stdout);
return 0;
}