Pagini recente » Cod sursa (job #1404014) | Cod sursa (job #3203038) | Cod sursa (job #779679) | Cod sursa (job #2962146) | Cod sursa (job #1000299)
#include <cstdio>
using namespace std;
#define N 500001
int a[N], b[N],n;
void merge(int a[], int left, int right) {
/// ai a[left...right] si stii ca a[left..middle] si
// a[middle + 1, right] sunt sortate si tu trebuie sa sortezi a[left...right]
int middle = (left + right) / 2;
int i, j, k = left - 1;
for (i = left, j = middle + 1; i <= middle && j <= right; )
if (a[i] < a[j]) // adaugam pe a[i]
b[++k] = a[i++];
else
b[++k] = a[j++];//!!!!!!!!!!!!! ce-i aici? era b[++k]=b[j++]!!!
// acum mai pot ramane unele elemente
// de ex daca ai [1, 2, 3] si [4, 5, 6] primele se iau alea din primul sir
// deci iti raman 4 5 6 pe care trebuie sa le adaugi
for (; i <= middle; ++i)
b[++k] = a[i];
for (; j <= right; ++j)
b[++k] = a[j];
// si acum le mutam la loc din b in a
for (i = left; i <= right; ++i)//de ce mai plusezi si j-ul?
a[i] = b[i];// initial aveam in b de la 1 la ... si aveam a[i] = b[j]
}
void sortare(int a[], int left, int right) {
if(left >= right)// :| ?:)), da, aveam impresia ca e nefolositor in cazul asta
//same shit:))
return;
//declara middle
//asta vroiam:))
int middle = (right + left) / 2;
sortare(a, left, middle);
sortare(a, middle + 1, right);
// ai apelat recursiv, iar cand revii stii ca cele 2 subvectori sunt sortati
// deci trebuie sa ii interclasezi
merge(a, left, right);
}
//testeaza
int main(){
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
scanf("%d ", &n);
for(int i = 1; i <= n; ++i)
scanf("%d ", &a[i]);
sortare(a, 1, n);
for(int i = 1; i <= n; ++i)
printf("%d ", a[i]);
printf("\n");
}
// pune fisierele si trimite
//dar stai ca nu le sorteaza nu? pai nu asta vroiam sa-ti arat
// mda... :)) acum pune fisiere si trimite