Cod sursa(job #522202)

Utilizator liviu12345Stoica Liviu liviu12345 Data 14 ianuarie 2011 15:37:06
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>

using namespace std ;

int A [ 500001 ] ;

void HMS ( int * , int ) ;

void swap ( int & , int & ) ;

int main ( )
{
  freopen ( "algsort.in" , "r" , stdin ) ;
  freopen ( "algsort.out" , "w" , stdout ) ;
  int  N ;
  scanf ( "%d" , &N ) ;
  for ( int i = 0 ; i < N ; ++i ) 
    scanf ( "%d" , &A [ i ] ) ;
  HMS ( A , N ) ;
  return 0 ;
}

void HMS ( int *A , int N )
{
  int **pPoz = new int* [ N ] , **pStop = new int* [ N ] ; 
  int *pHeap = new int [ N + N ]  , *stop = A + N ;
  int *B = new int [ N ] ;
  int heapSize = 0 , pSize = 0 , Nod , St , min ;
  pPoz [ 0 ] = A ;
  for ( int *i = A + 1 ; i < stop ; ++i )
    if ( *i < *( i - 1 ) )
    {
      pStop [ pSize ] = i ;
      pHeap [ ++heapSize ] = pSize ;
      pPoz [ ++pSize ] = i ;
    }
  pHeap [ ++heapSize ] = pSize ;
  pStop [ pSize ] = A + N ;
  for ( int i = heapSize >> 1 ; i ; --i )
  {
    Nod = i ;
    while ( true )
    {
      St = Nod << 1 , min = Nod ;
      if (  St <= heapSize )
	if ( *(pPoz [ pHeap [ min ] ]) > *(pPoz [ pHeap [ St ] ] ) )
	  min = St ;
	else ;
      else break ;
      ++St ;
      if ( St <= heapSize )
	if ( *(pPoz [ pHeap [ min ] ]) > *(pPoz [ pHeap [ St ] ]) )
	  min = St ;
	else ;
      else break ;
      if ( Nod != min )
      {
	swap ( pHeap [ min ] , pHeap [ Nod ] ) ;
	Nod = min ;
      }
      else
	break ;
    }
  }
  for ( int i = 0 ; i < N ; ++i )
  {
    printf ( "%d " , *pPoz [ pHeap [ 1 ] ] ) ;
    ++pPoz [ pHeap [ 1 ] ] ;
    if ( pPoz [ pHeap [ 1 ] ] == pStop [ pHeap [ 1 ] ] )
    {
      pHeap [ 1 ] = pHeap [ heapSize ] ;
      --heapSize ;
    }
    Nod = 1 ;
    while ( heapSize )
    {
      St = Nod << 1 , min = Nod ;
      if ( *(pPoz [ pHeap [ min ] ]) > *(pPoz [ pHeap [ St ] ]) && St <= heapSize )
	min = St ;
      ++St ;
      if ( *(pPoz [ pHeap [ min ] ]) > *(pPoz [ pHeap [ St ] ]) && St <= heapSize )
	min = St ;
      if ( Nod != min )
      {
	swap ( pHeap [ min ] , pHeap [ Nod ] ) ;
	Nod = min ;
      }
      else
	break ;
    }
  }
}

void swap ( int &A , int &B )
{
  A ^= B ;
  B ^= A ;
  A ^= B ;
}