Pagini recente » Cod sursa (job #2611136) | Cod sursa (job #132505) | Cod sursa (job #1554459) | Cod sursa (job #258181) | Cod sursa (job #1213139)
#include <fstream>
#include <iostream>
#define SIZE 500000
using namespace std;
ifstream ifs("algsort.in");
ofstream ofs("algsort.out");
int A[SIZE], B[SIZE], N;
inline int min(int a, int b)
{
return (a < b ? a : b);
}
void merge(int left, int mid, int right)
{
if (A[mid] < A[mid+1])
{
// There is no need for the merge phase
return;
}
// Copy the data into the auxiliary array
for (int i = left; i <= right; ++i)
{
B[i] = A[i];
}
int i = left;
int j = mid+1;
for (int k = left; k <= right; ++k)
{
if (i > mid) A[k] = B[j++];
else if (j > right) A[k] = B[i++];
else if (B[i] <= B[j]) A[k] = B[i++];
else A[k] = B[j++];
}
}
void bottom_up_mergesort(int left, int right)
{
int N = right - left + 1;
for (int step = 1; step < N; step += step)
{
for (int offset = left; offset < (right - step + 1); offset += step + step)
{
int m = min(offset + step + step - 1, right);
merge(offset, offset + step - 1, m);
}
}
}
int main()
{
ifs >> N;
for (int i = 0; i < N; ++i)
{
ifs >> A[i];
}
bottom_up_mergesort(0, N-1);
for (int i = 0; i < N; ++i)
{
ofs << A[i] << " ";
}
return 0;
}