#include <stdio.h>
#include <time.h>
#include <algorithm>
#include <random>
#include <x86intrin.h>
void radix( unsigned sdv,int * a,int * b) {
constexpr unsigned mask= 0xff ;
unsigned mk[ 256 ] = { } ;
int * pk[ 256 ] ,temp;
for ( int * i= a; i< b; i++ ) {
mk[ ( * i>> sdv) & mask] ++ ;
}
pk[ 0 ] = a;
for ( int i= 1 ; i< 256 ; i++ )
pk[ i] = pk[ i- 1 ] + mk[ i- 1 ] ;
for ( unsigned i= 0 ; i< 256 ; i++ )
{
while ( mk[ i] > 0 ) {
temp= * pk[ i] ;
unsigned y= ( ( temp) >> sdv) & mask;
while ( y! = i) {
std:: swap ( temp,* pk[ y] ) ;
pk[ y] ++ ;
mk[ y] -- ;
y= ( ( temp) >> sdv) & mask;
}
* pk[ i] = temp;
pk[ i] ++ ;
mk[ i] -- ;
}
} ;
if ( sdv== 0 )
return ;
if ( unsigned r= ( pk[ 0 ] - a) ; r< 48 * ( 1 + ( sdv>> 3 ) ) ) {
std:: sort ( a,pk[ 0 ] ) ;
}
else
radix( sdv- 8 ,a,pk[ 0 ] ) ;
for ( unsigned i= 1 ; i< 256 ; i++ ) {
if ( unsigned r= ( pk[ i] - pk[ i- 1 ] ) ; r< 48 * ( 1 + ( sdv>> 3 ) ) ) {
std:: sort ( pk[ i- 1 ] ,pk[ i] ) ;
}
else radix( sdv- 8 ,pk[ i- 1 ] ,pk[ i] ) ;
}
}
void test( unsigned n,bool use_radix= false ) {
std:: default_random_engine gen( _rdtsc( ) ) ;
std:: uniform_int_distribution < int > ds( - 2147483648 ,2147483647 ) ;
std:: vector < int > arr( n) ;
for ( unsigned i= 0 ; i< n; i++ ) //заполнение случайными
arr[ i] = ds( gen) ;
unsigned t1,t2;
if ( use_radix) {
t1= clock ( ) ;
radix( 24 ,arr.data ( ) ,arr.data ( ) + arr.size ( ) ) ;
t2= clock ( ) ;
printf ( "radix sort %d in %.3f ms\n " ,n,1.0e3 * double ( t2- t1) / CLOCKS_PER_SEC ) ;
} else {
t1= clock ( ) ;
std:: sort ( arr.begin ( ) ,arr.end ( ) ) ;
t2= clock ( ) ;
printf ( "std sort %d in %.3f ms\n " ,n,1.0e3 * double ( t2- t1) / CLOCKS_PER_SEC ) ;
}
}
int main( )
{
test( 100000 ) ;
test( 1000000 ) ;
test( 10000000 ) ;
test( 100000 ,true ) ;
test( 1000000 ,true ) ;
test( 10000000 ,true ) ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDx4ODZpbnRyaW4uaD4KCnZvaWQgcmFkaXgodW5zaWduZWQgc2R2LGludCogYSxpbnQqIGIpewoKCWNvbnN0ZXhwciB1bnNpZ25lZCBtYXNrPTB4ZmY7Cgl1bnNpZ25lZCBta1syNTZdPXt9OwoJaW50ICpwa1syNTZdLHRlbXA7CgoJZm9yIChpbnQqIGk9YTtpPGI7aSsrKXsKCQlta1soKmk+PnNkdikmbWFza10rKzsKCX0KCXBrWzBdPWE7Cglmb3IgKGludCBpPTE7aTwyNTY7aSsrKQoJCXBrW2ldPXBrW2ktMV0rbWtbaS0xXTsKCWZvciAodW5zaWduZWQgaT0wO2k8MjU2O2krKykKCXsKCQl3aGlsZSAobWtbaV0+MCl7CgkJCXRlbXA9KnBrW2ldOwoJCQl1bnNpZ25lZCB5PSgodGVtcCk+PnNkdikmbWFzazsKCQkJd2hpbGUgKHkhPWkpewoJCQkJc3RkOjpzd2FwKHRlbXAsKnBrW3ldKTsKCQkJCXBrW3ldKys7CgkJCQlta1t5XS0tOwoJCQkJeT0oKHRlbXApPj5zZHYpJm1hc2s7CgkJCX0KCQkJKnBrW2ldPXRlbXA7CgkJCXBrW2ldKys7CgkJCW1rW2ldLS07CgkJfQoJfTsKCWlmIChzZHY9PTApCgkJcmV0dXJuOwoKCWlmICh1bnNpZ25lZCByPShwa1swXS1hKTtyPDQ4KigxKyhzZHY+PjMpKSl7CgkJc3RkOjpzb3J0KGEscGtbMF0pOwoJfQoJZWxzZQoJCXJhZGl4KHNkdi04LGEscGtbMF0pOwoJZm9yICh1bnNpZ25lZCBpPTE7aTwyNTY7aSsrKXsKCQlpZiAodW5zaWduZWQgcj0ocGtbaV0tcGtbaS0xXSk7cjw0OCooMSsoc2R2Pj4zKSkpewoJCQlzdGQ6OnNvcnQocGtbaS0xXSxwa1tpXSk7CgkJfQoJCWVsc2UgcmFkaXgoc2R2LTgscGtbaS0xXSxwa1tpXSk7Cgl9Cgp9Cgp2b2lkIHRlc3QodW5zaWduZWQgbixib29sIHVzZV9yYWRpeD1mYWxzZSl7CglzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oX3JkdHNjKCkpOwoJc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkcygtMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3KTsKCXN0ZDo6dmVjdG9yPGludD4gYXJyKG4pOwoJZm9yICh1bnNpZ25lZCBpPTA7aTxuO2krKykvL9C30LDQv9C+0LvQvdC10L3QuNC1INGB0LvRg9GH0LDQudC90YvQvNC4CgkJYXJyW2ldPWRzKGdlbik7CgoJdW5zaWduZWQgdDEsdDI7CgoJaWYgKHVzZV9yYWRpeCl7CgkJdDE9Y2xvY2soKTsKCQlyYWRpeCgyNCxhcnIuZGF0YSgpLGFyci5kYXRhKCkrYXJyLnNpemUoKSk7CgkJdDI9Y2xvY2soKTsKCQlwcmludGYoInJhZGl4IHNvcnQgJWQgaW4gJS4zZiBtc1xuIixuLDEuMGUzKmRvdWJsZSh0Mi10MSkvQ0xPQ0tTX1BFUl9TRUMpOwoJfWVsc2V7CgkJdDE9Y2xvY2soKTsKCQlzdGQ6OnNvcnQoYXJyLmJlZ2luKCksYXJyLmVuZCgpKTsKCQl0Mj1jbG9jaygpOwoJCXByaW50Zigic3RkIHNvcnQgJWQgaW4gJS4zZiBtc1xuIixuLDEuMGUzKmRvdWJsZSh0Mi10MSkvQ0xPQ0tTX1BFUl9TRUMpOwoJfQoKCn0KCmludCBtYWluKCkKewoJdGVzdCgxMDAwMDApOwoJdGVzdCgxMDAwMDAwKTsKCXRlc3QoMTAwMDAwMDApOwoJdGVzdCgxMDAwMDAsdHJ1ZSk7Cgl0ZXN0KDEwMDAwMDAsdHJ1ZSk7Cgl0ZXN0KDEwMDAwMDAwLHRydWUpOwp9Cg==