Pagini recente » Cod sursa (job #3136834) | Cod sursa (job #1819735) | Cod sursa (job #2706288) | Cod sursa (job #2258413) | Cod sursa (job #3208998)
#include <bits/stdc++.h>
#define N 500000
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
/**
Implementati un MergeSort si un QuickSort
*/
int n, a[N + 5];
void Citire()
{
fin >> n;
for(int i = 1; i <= n; ++i)
fin >> a[i];
}
int Pivotare(int st, int dr, int a[N + 5])
{
// aleg ca pivot elementul din mijloc
int mij = (st + dr) / 2;
int val_pivot = a[mij];
swap(a[mij], a[dr]);
int ult_poz = st; // ult pozitie unde pot sa pun un nr mai mic decat pivotul
for(int i = st; i < dr; ++i)
if(a[i] < val_pivot)
{
swap(a[i], a[ult_poz]);
ult_poz++;
}
swap(a[dr], a[ult_poz]);
return ult_poz;
}
void QS(int st, int dr, int a[N + 5])
{
if(st == dr || st > dr) return;
else
{
int pivot = Pivotare(st, dr, a);
QS(st, pivot - 1, a);
QS(pivot + 1, dr, a);
}
}
void Interclasare(int st1, int dr1, int st2, int dr2, int a[N + 5])
{
int aux[N + 5], ind = 0;
int i = st1, j = st2;
while(i <= dr1 && j <= dr2)
{
if(a[i] <= a[j])
aux[++ind] = a[i++];
else
aux[++ind] = a[j++];
}
while(i <= dr1)
aux[++ind] = a[i++];
while(j <= dr2)
aux[++ind] = a[j++];
// copiere
for(i = 1; i <= ind; ++i)
a[st1 + i - 1] = aux[i];
}
void MergeSort(int st, int dr, int a[N + 5])
{
if(st == dr || st > dr) return;
else
{
int mij = (st + dr) / 2;
MergeSort(st, mij, a);
MergeSort(mij + 1, dr, a);
Interclasare(st, mij, mij + 1, dr, a);
}
}
void Afisare(int st, int dr, int a[N + 5])
{
for(int i = st; i <= dr; ++i)
fout << a[i] << " ";
}
int main()
{
Citire();
MergeSort(1, n, a);
Afisare(1, n, a);
return 0;
}