Pagini recente » Cod sursa (job #378252) | Cod sursa (job #71839) | Cod sursa (job #556034) | Cod sursa (job #2382054) | Cod sursa (job #1567548)
#include <fstream>
#include <iostream>
#define FIN "algsort.in"
#define FOUT "algsort.out"
using namespace std;
class Container {
public:
Container( int _n ): n( _n ){
vec = new int[ n ];
k = 0;
}
void added(int elem) {
*( vec + k++ ) = elem;
}
void sorted() {
_divide(0, n - 1);
}
void display() {
ofstream fout( FOUT );
for(int i = 0; i < n; ++i) fout<<vec[ i ]<<" ";
}
private:
int *vec;
int n, k;
void _divide(int lo,int hi) {
if((hi - lo) <= 1) {
_swap(lo, hi);
} else {
int m;
m = (lo + hi) >> 1;
_divide(lo, m);
_divide(m + 1, hi);
_merge(lo, m, hi);
}
}
void _merge(int lo, int m, int hi) {
int i = lo,
j = m + 1,
k = lo;
int *aux;
aux = new int[ hi - lo + 1 ];
for(int it = lo; it <= hi; ++it) aux[ it - lo ] = vec[ it ];
while(i <= m && j <= hi) {
if( aux[ i - lo ] <= aux[ j - lo ]) vec[ k++ ] = aux[ i++ - lo];
else
vec[ k++ ] = aux[ j++ - lo];
}
while(i <= m) vec[ k++ ] = aux[ i++ - lo];
while(j <= hi) vec[ k++ ] = aux[ j++ - lo];
delete [] aux;
}
void _swap(int i, int j) {
if(vec[ i ] > vec[ j ]) {
int a = vec[ i ],
b = vec[ j ];
a = a + b;
b = a - b;
a = a - b;
vec[ i ] = a;
vec[ j ] = b;
}
}
};
int main() {
int n,
elem;
ifstream fin( FIN );
fin>>n;
Container container( n );
for(int i = 0; i < n; ++i) fin>>elem, container.added( elem );
container.sorted();
container.display();
return(0);
};