Pagini recente » Cod sursa (job #2858957) | Cod sursa (job #476634) | Cod sursa (job #2276176) | Cod sursa (job #2323636) | Cod sursa (job #1754380)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define nmax 500003
ifstream in("algsort.in");
ofstream out("algsort.out");
/////////////////////////////////////////////////
////////
//////// qsort C library
////////
////////////////////////////////////////////////
int comp(const void *a, const void * b)
{
return *(int*)a - *(int*)b;
}
void qsortC(int *v, int n)
{
qsort(v,n,sizeof(int),&comp);
}
/////////////////////////////////////////////////
////////
//////// mergesort scurt
////////
////////////////////////////////////////////////
const int N = 500000;
int B[N+2];
void merge_sort(int* A,int l, int r)//folosim merge sort in care avem si functia de spargere in jumatatie de intervale si
{ //combinarea intervalelor
int m = (l + r) >> 1, i, j, k;
if (l == r) return;
merge_sort(A,l, m);//spargem in stanga
merge_sort(A,m + 1, r);//spargem in dreapta
for(int i = l , j = m+1, k = l; i<= m || j <= r; )//recombinam mergand cu ambii indici din stanga si de la mij+1
if( i > m ||( i<=m && A[i] > A[j]))//daca ori am terminat ce e in stanga ori ce e in stanga e mai mare ca dreapta
B[k++] = A[j++];//adaugam ce e in dreapta
else
B[k++] = A[i++];//altfel ce e in stanga
for(int i = l ; i <= r ; i ++)
A[i] = B[i];//punem totul in A
}
/////////////////////////////////////////////////
////////
//////// mergesort clasic
////////
////////////////////////////////////////////////
void mergeit(int *A, int l , int r)
{
int m =(l+r)/2, i = l, j = m+1, k = l;
while(i <= m && j <= r)
if( A[i]<= A[j])
B[k++] = A[i++];
else
B[k++] = A[j++];
while(i <= m )
B[k++] = A[i++];
while(j <= r )
B[k++] = A[j++];
for(int k = l ; k <= r ; k++)
A[k] = B[k];
}
void mergesort(int *A, int l , int r)
{
if(r - l >=1)
{
int mid = (l+r)/2;
mergesort(A,l,mid);
mergesort(A,mid+1,r);
mergeit(A,l,r);
}
}
int main()
{
int n,i;
in >> n;
int heap[n+1];
for( i = 0 ; i < n ; i++)
in >> heap[i];
merge_sort(heap,0,n);//pozitia primullui element si nr de elemente
//mergesort(heap,0,n-1);
for(int i = 0 ; i < n ; i ++)
out << heap[i] << " ";
return 0;
}