Pagini recente » Cod sursa (job #2389002) | Cod sursa (job #2171546) | Istoria paginii runda/cner12a/clasament | Cod sursa (job #471246) | Cod sursa (job #808215)
Cod sursa(job #808215)
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
const int N=510000;
int n;
int v[N];
void MergeSort(int left,int right){
if(left>=right){
return;
}
int m=(left+right)/2;
MergeSort(left,m); // sort each half
MergeSort(m+1,right);
int *aux;
aux=new int[right+1];
int k=left,lcursor=left,rcursor=m+1;
while(lcursor<=m && rcursor<=right){
if(v[lcursor]<v[rcursor]){
aux[k++]=v[lcursor++];
}
else{
aux[k++]=v[rcursor++];
}
}
while(lcursor<=m){
aux[k++]=v[lcursor++];
}
while(rcursor<=right){
aux[k++]=v[rcursor++];
}
for(int i=left;i<=right;++i){
v[i]=aux[i];
}
delete aux;
}
void Quicksort(int left,int right){
if(left>=right)
return;
int randpivot=(rand()%(right-left))+left;
swap(v[left],v[randpivot]);
int pivot=v[left];
int l=left+1,r=right;
while(l<r){
if(v[l]>pivot){
swap(v[l],v[r]);
r--;
continue;
}
l++;
}
if(v[l]<=pivot){
swap(v[l],v[left]);
Quicksort(left,l-1);
Quicksort(l+1,right);
}
else{
swap(v[l-1],v[left]);
Quicksort(left,l-2);
Quicksort(l,right);
}
}
int main(){
int i;
in>>n;
for(i=1;i<=n;++i){
in>>v[i];
}
Quicksort(1,n);
for(i=1;i<=n;++i){
out<<v[i]<<" ";
}
}