Pagini recente » Cod sursa (job #204915) | Cod sursa (job #2168199) | Cod sursa (job #1486620) | Cod sursa (job #1585222) | Cod sursa (job #1333084)
#include <stdint.h>
#include <limits>
#include <fstream>
using namespace std;
const uint32_t MAX_ELEMENTS = 500010;
uint32_t A[MAX_ELEMENTS];
uint32_t N;
void read()
{
ifstream in("algsort.in");
in >> N;
for (uint32_t i = 1; i <= N; i++)
{
in >> A[i];
}
in.close();
}
void write()
{
ofstream out("algsort.out");
for (uint32_t i = 1; i <= N; i++)
{
out << A[i] << " ";
}
out.close();
}
void merge(uint32_t start, uint32_t middle, uint32_t end)
{
uint32_t leftSize = middle - start + 1;
uint32_t rightSize = end - middle;
uint32_t *L = new uint32_t[leftSize + 1];
uint32_t *R = new uint32_t[rightSize + 1];
for (uint32_t i = 0; i < leftSize; i++)
{
L[i] = A[i + start];
}
for (uint32_t j = 0; j < rightSize; j++)
{
R[j] = A[j + middle + 1];
}
uint32_t i = 0, j = 0, k = 0;
while (i < leftSize && j < rightSize){
if (L[i] <= R[j])
{
A[start + k] = L[i];
i++;
}
else
{
A[start + k] = R[j];
j++;
}
k++;
}
while (i < leftSize){
A[start + k] = L[i];
i++;
k++;
}
while (j < rightSize){
A[start + k] = R[j];
j++;
k++;
}
delete L;
delete R;
}
void mergeSort(uint32_t start, uint32_t end)
{
if (start<end){
uint32_t middle = (start + end) / 2;
mergeSort(start, middle);
mergeSort(middle + 1, end);
merge(start, middle, end);
}
}
void sort()
{
mergeSort(1, N);
}
int main()
{
read();
sort();
write();
}