// RUSSIAN SORTING HALVES DANILIN
using System; using System.Text ;
class rsh
{ static long [ ] a; static long [ ] d;
static void Main( string[ ] args)
{ int n = 1000000 ;
var age = 1 + Math.Log ( n) / Math.Log ( 2 ) ;
Console.WriteLine ( n) ;
a = new long [ n + 1 ] ; d = new long [ n + 1 ] ;
for ( int i = 1 ; i <= n; i++ )
// WRITE ON SCREEN
int m = Math.Min ( n, 10 ) ;
for ( int i = 1 ; i <= m; i++ )
Console.Write ( "{0} " , d[ i] ) ;
Console.WriteLine ( ) ;
// RUSSIAN SORTING HALVES DANILIN
var start = DateTime.Now ;
if ( age > 0 )
dav( 1 , n, 1 , age) ;
var finish = DateTime.Now ;
Console.WriteLine ( "{0} second" , ( finish - start) .TotalSeconds ) ;
// WRITE ON SCREEN
Console.WriteLine ( "[1..{0}]" , m) ;
for ( int i = 1 ; i <= m; i++ )
Console.Write ( "{0} " , d[ i] ) ;
Console.WriteLine ( ) ;
// WRITE ON SCREEN
Console.WriteLine ( "[{0}..{1}]" , n - m + 1 , n) ;
for ( int i = n - m + 1 ; i <= n; i++ )
Console.Write ( "{0} " , d[ i] ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Press any key" ) ; Console.ReadKey ( ) ;
}
static void dav( int ab, int yz, int part, double age)
{ if ( yz - ab < 1 ) return ;
long summa = 0 ;
for ( int i = ab; i <= yz; i++ )
summa = summa + d[ i] ;
double middle = summa / ( yz - ab + 1.0 ) ;
var abc = ab - 1 ; var xyz = yz + 1 ;
for ( int i = ab; i <= yz; i++ )
if ( d[ i] < middle)
{ abc = abc + 1 ; a[ abc] = d[ i] ;
}
else
{ xyz = xyz - 1 ; a[ xyz] = d[ i] ;
}
for ( int i = ab; i <= yz; i++ )
d[ i] = a[ i] ;
if ( part < age)
{ if ( abc >= ab) dav( ab, abc, part + 1 , age) ;
if ( xyz <= yz) dav( xyz, yz, part + 1 , age) ;
}
return ; } }
Ly8gUlVTU0lBTiBTT1JUSU5HIEhBTFZFUyBEQU5JTElOCnVzaW5nIFN5c3RlbTsgdXNpbmcgU3lzdGVtLlRleHQ7CmNsYXNzIHJzaAp7ICAgc3RhdGljIGxvbmdbXSBhOyBzdGF0aWMgbG9uZ1tdIGQ7CiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7ICAgaW50IG4gPSAxMDAwMDAwOwogICAgICAgIHZhciBhZ2UgPSAxICsgTWF0aC5Mb2cobikgLyBNYXRoLkxvZygyKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShuKTsKCiAgICAgICAgYSA9IG5ldyBsb25nW24gKyAxXTsgZCA9IG5ldyBsb25nW24gKyAxXTsKCiAgICAgICAgdmFyIHJhbmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgICAgICBkW2ldID0gcmFuZC5OZXh0KDEsIG4pOwoKICAgICAgICAvLyBXUklURSBPTiBTQ1JFRU4KICAgICAgICBpbnQgbSA9IE1hdGguTWluKG4sIDEwKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInswfSAiLCBkW2ldKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAvLyBSVVNTSUFOIFNPUlRJTkcgSEFMVkVTIERBTklMSU4KICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CiAgICAgICAgaWYgKGFnZSA+IDApCiAgICAgICAgICAgIGRhdigxLCBuLCAxLCBhZ2UpOwogICAgICAgIHZhciBmaW5pc2ggPSBEYXRlVGltZS5Ob3c7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gc2Vjb25kIiwgKGZpbmlzaCAtIHN0YXJ0KS5Ub3RhbFNlY29uZHMpOwoKICAgICAgICAvLyBXUklURSBPTiBTQ1JFRU4KICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiWzEuLnswfV0iLCBtKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInswfSAiLCBkW2ldKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICAvLyBXUklURSBPTiBTQ1JFRU4KICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiW3swfS4uezF9XSIsIG4gLSBtICsgMSwgbik7CiAgICAgICAgZm9yIChpbnQgaSA9IG4gLSBtICsgMTsgaSA8PSBuOyBpKyspCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInswfSAiLCBkW2ldKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQcmVzcyBhbnkga2V5Iik7IENvbnNvbGUuUmVhZEtleSgpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIGRhdihpbnQgYWIsIGludCB5eiwgaW50IHBhcnQsIGRvdWJsZSBhZ2UpCiAgICB7ICAgaWYgKHl6IC0gYWIgPCAxKSByZXR1cm47CgogICAgICAgIGxvbmcgc3VtbWEgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSBhYjsgaSA8PSB5ejsgaSsrKQogICAgICAgICAgICBzdW1tYSA9IHN1bW1hICsgZFtpXTsKCiAgICAgICAgICAgZG91YmxlIG1pZGRsZSA9IHN1bW1hIC8gKHl6IC0gYWIgKyAxLjApOwogICAgICAgICAgIHZhciBhYmMgPSBhYiAtIDE7IHZhciB4eXogPSB5eiArIDE7CgogICAgICAgIGZvciAoaW50IGkgPSBhYjsgaSA8PSB5ejsgaSsrKQogICAgICAgICAgICBpZiAoZFtpXSA8IG1pZGRsZSkKICAgICAgICAgICAgeyAgIGFiYyA9IGFiYyArIDE7IGFbYWJjXSA9IGRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7ICAgeHl6ID0geHl6IC0gMTsgYVt4eXpdID0gZFtpXTsKICAgICAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gYWI7IGkgPD0geXo7IGkrKykKICAgICAgICAgICAgZFtpXSA9IGFbaV07CgogICAgICAgIGlmIChwYXJ0IDwgYWdlKQogICAgICAgIHsgICBpZiAoYWJjID49IGFiKSBkYXYoYWIsIGFiYywgcGFydCArIDEsIGFnZSk7CiAgICAgICAgICAgIGlmICh4eXogPD0geXopIGRhdih4eXosIHl6LCBwYXJ0ICsgMSwgYWdlKTsKICAgICAgICB9CnJldHVybjsgfX0=