Cod sursa(job #2320447)

Utilizator sabinpocrisSabin P sabinpocris Data 14 ianuarie 2019 19:24:37
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include<algorithm>
#include<cstdlib>
#include<ctime>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

const int N = 500010;
int n,a[N],b[N];
void quickSort(int,int);
void mergeSort(int,int);
void interclasare(int,int,int);
void heapSort();
void heapDown(int,int);
int main()
{
  srand(time(0));
  f>>n;
  for(int i=1;i<=n;i++)
    f>>a[i];
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++)
    g<<a[i]<<' ';

  return 0;
}
void mergeSort(int st,int dr)
{
  if(st==dr)
    return;
  int mi=(st+dr)/2;
  mergeSort(st,mi);
  mergeSort(mi+1,dr);
  interclasare(st,mi+1,dr);
}
void interclasare(int st,int mi,int dr)
{
  int k=st,i=st,j=mi;
  while(i<mi&&j<=dr)
    {
      if(a[i]<=a[j])
	b[k++]=a[i++];
      else
	b[k++]=a[j++];
	
    }
  while(i<mi)
    b[k++]=a[i++];
  while(j<=dr)
    b[k++]=a[j++];
  for(i=st;i<=dr;i++)
    a[i]=b[i];
}
void quickSort(int St,int Dr)
{
  int st=St,dr=Dr,mi,pivot;

  mi=st+rand()%(dr-st+1);
  pivot=a[mi];
  do
    {
      while(a[st]<pivot)st++;
      while(a[dr]>pivot)dr--;
      if(st<=dr){swap(a[st],a[dr]);st++;dr--;}
    }
  while(st<=dr);
  if(St<=dr)quickSort(St,dr);
  if(st<=Dr)quickSort(st,Dr);
}
void heapDown(int tata,int lg)
{
  int fiu=2*tata;
  if(fiu>lg)return;
  if(fiu<lg)if(a[fiu+1]>a[fiu])fiu++;
  if(a[tata]<a[fiu]){swap(a[tata],a[fiu]),heapDown(fiu,lg);}
}
void heapSort()
{
  for(int i=n/2;i>=1;i--)
    heapDown(i,n);
  for(int i=n;i>=1;i--)
    {
      swap(a[1],a[i]);
      heapDown(1,i-1);
    }
}