Pagini recente » Cod sursa (job #1308359) | Cod sursa (job #2371513) | Cod sursa (job #2291511) | Cod sursa (job #2700657) | Cod sursa (job #522201)
Cod sursa(job #522201)
#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 break ;
++St ;
if ( St <= heapSize )
if ( *(pPoz [ pHeap [ min ] ]) > *(pPoz [ pHeap [ St ] ]) )
min = St ;
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 ;
}