#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>
#include <vector>
#include <algorithm>
#define N 10000000
int compare(const void *p, const void *q)
{
register double p0 = *(double*)p;
register double q0 = *(double*)q;
if (p0 > q0) return 1;
if (p0 < q0) return -1;
return 0;
}
#define MAXSTACK 2048
void qSortI(double *a, long size) {
long i, j;
long lb, ub;
long lbstack[MAXSTACK], ubstack[MAXSTACK];
long stackpos = 1;
long ppos;
double pivot;
double temp;
lbstack[1] = 0;
ubstack[1] = size-1;
do {
lb = lbstack[ stackpos ];
ub = ubstack[ stackpos ];
stackpos--;
do {
ppos = ( lb + ub ) >> 1;
i = lb; j = ub; pivot = a[ppos];
do {
while ( a[i] < pivot ) i++;
while ( pivot < a[j] ) j--;
if ( i <= j ) {
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j--;
}
} while ( i <= j );
if ( i < ppos ) {
if ( i < ub ) {
stackpos++;
lbstack[ stackpos ] = i;
ubstack[ stackpos ] = ub;
}
ub = j;
} else {
if ( j > lb ) {
stackpos++;
lbstack[ stackpos ] = lb;
ubstack[ stackpos ] = j;
}
lb = i;
}
} while ( lb < ub );
} while ( stackpos != 0 );
}
void test_c()
{
double *buf = (double*)malloc(sizeof(double) * N);
int i = 0;
for (i = 0; i < N; i++)
buf[i] = rand() + ( (double)rand() / 100000);
qsort(buf, N, sizeof(double), compare);
free(buf);
}
void test_c2()
{
double *buf = (double*)malloc(sizeof(double) * N);
int i = 0;
for (i = 0; i < N; i++)
buf[i] = rand() + ( (double)rand() / 100000);
qSortI(buf, N);
//printf("%f %f %f %f\n", buf[0], buf[10], buf[N-11], buf[N-1]);
free(buf);
}
void test_cplusplus()
{
std::vector<double> buf;
for (int i = 0; i < N; i++)
buf.push_back( rand() + ( (double)rand() / 100000) );
std::sort(buf.begin(), buf.end() );
}
typedef void (*test_proc)();
double test(test_proc proc)
{
LARGE_INTEGER start, stop, freq;
srand(GetTickCount());
QueryPerformanceCounter(&start);
proc();
QueryPerformanceCounter(&stop);
QueryPerformanceFrequency(&freq);
return double(stop.LowPart - start.LowPart) / freq.LowPart;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("test_c Result: %f\n", test(test_c) );
printf("test_cplusplus Result: %f\n", test(test_cplusplus) );
printf("test_c2 Result: %f\n", test(test_c2) );
getchar();
return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0Y2hhci5oPgojaW5jbHVkZSA8Y29uaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgPFdpbmRvd3MuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCgojZGVmaW5lIE4gMTAwMDAwMDAKCmludCBjb21wYXJlKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCnsKCXJlZ2lzdGVyIGRvdWJsZSBwMCA9ICooZG91YmxlKilwOwoJcmVnaXN0ZXIgZG91YmxlIHEwID0gKihkb3VibGUqKXE7CglpZiAocDAgPiBxMCkgcmV0dXJuIDE7CglpZiAocDAgPCBxMCkgcmV0dXJuIC0xOwoJcmV0dXJuIDA7Cn0KI2RlZmluZSBNQVhTVEFDSyAyMDQ4CnZvaWQgcVNvcnRJKGRvdWJsZSAqYSwgbG9uZyBzaXplKSB7Cglsb25nIGksIGo7Cglsb25nIGxiLCB1YjsKCWxvbmcgbGJzdGFja1tNQVhTVEFDS10sIHVic3RhY2tbTUFYU1RBQ0tdOwoKCWxvbmcgc3RhY2twb3MgPSAxOwoJbG9uZyBwcG9zOwoJZG91YmxlIHBpdm90OwoJZG91YmxlIHRlbXA7IAoKCWxic3RhY2tbMV0gPSAwOwoJdWJzdGFja1sxXSA9IHNpemUtMTsKCglkbyB7CgkJbGIgPSBsYnN0YWNrWyBzdGFja3BvcyBdOwoJCXViID0gdWJzdGFja1sgc3RhY2twb3MgXTsKCQlzdGFja3Bvcy0tOwoJCWRvIHsKCQkJcHBvcyA9ICggbGIgKyB1YiApID4+IDE7CgkJCWkgPSBsYjsgaiA9IHViOyBwaXZvdCA9IGFbcHBvc107CgoJCQlkbyB7CgkJCQl3aGlsZSAoIGFbaV0gPCBwaXZvdCApIGkrKzsKCQkJCXdoaWxlICggcGl2b3QgPCBhW2pdICkgai0tOwoKCQkJCWlmICggaSA8PSBqICkgewoJCQkJCXRlbXAgPSBhW2ldOyBhW2ldID0gYVtqXTsgYVtqXSA9IHRlbXA7CgkJCQkJaSsrOyBqLS07CgkJCQl9CgkJCX0gd2hpbGUgKCBpIDw9IGogKTsKCQkJaWYgKCBpIDwgcHBvcyApIHsKCQkJCWlmICggaSA8IHViICkgewoJCQkJCXN0YWNrcG9zKys7CgkJCQkJbGJzdGFja1sgc3RhY2twb3MgXSA9IGk7CgkJCQkJdWJzdGFja1sgc3RhY2twb3MgXSA9IHViOwoJCQkJfQoJCQkJdWIgPSBqOwoJCQl9IGVsc2UgewoJCQkJaWYgKCBqID4gbGIgKSB7IAoJCQkJCXN0YWNrcG9zKys7CgkJCQkJbGJzdGFja1sgc3RhY2twb3MgXSA9IGxiOwoJCQkJCXVic3RhY2tbIHN0YWNrcG9zIF0gPSBqOwoJCQkJfQoJCQkJbGIgPSBpOwoJCQl9CgkJfSB3aGlsZSAoIGxiIDwgdWIgKTsKCX0gd2hpbGUgKCBzdGFja3BvcyAhPSAwICk7Cn0KCnZvaWQgdGVzdF9jKCkKewoJZG91YmxlICpidWYgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBOKTsKCWludCBpID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQoJCWJ1ZltpXSA9IHJhbmQoKSArICggKGRvdWJsZSlyYW5kKCkgLyAxMDAwMDApOwoKCXFzb3J0KGJ1ZiwgTiwgc2l6ZW9mKGRvdWJsZSksIGNvbXBhcmUpOwoKCWZyZWUoYnVmKTsKfQoKdm9pZCB0ZXN0X2MyKCkKewoJZG91YmxlICpidWYgPSAoZG91YmxlKiltYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBOKTsKCWludCBpID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQoJCWJ1ZltpXSA9IHJhbmQoKSArICggKGRvdWJsZSlyYW5kKCkgLyAxMDAwMDApOwoKCXFTb3J0SShidWYsIE4pOwoJLy9wcmludGYoIiVmICVmICVmICVmXG4iLCBidWZbMF0sIGJ1ZlsxMF0sIGJ1ZltOLTExXSwgYnVmW04tMV0pOwoKCWZyZWUoYnVmKTsKfQoKdm9pZCB0ZXN0X2NwbHVzcGx1cygpCnsKCXN0ZDo6dmVjdG9yPGRvdWJsZT4gYnVmOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCgkJYnVmLnB1c2hfYmFjayggcmFuZCgpICsgKCAoZG91YmxlKXJhbmQoKSAvIDEwMDAwMCkgKTsKCglzdGQ6OnNvcnQoYnVmLmJlZ2luKCksIGJ1Zi5lbmQoKSApOwp9Cgp0eXBlZGVmIHZvaWQgKCp0ZXN0X3Byb2MpKCk7Cgpkb3VibGUgdGVzdCh0ZXN0X3Byb2MgcHJvYykKewoJTEFSR0VfSU5URUdFUiBzdGFydCwgc3RvcCwgZnJlcTsKCXNyYW5kKEdldFRpY2tDb3VudCgpKTsKCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZzdGFydCk7CgoJcHJvYygpOwoKCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZzdG9wKTsKCVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOwoJcmV0dXJuIGRvdWJsZShzdG9wLkxvd1BhcnQgLSBzdGFydC5Mb3dQYXJ0KSAvIGZyZXEuTG93UGFydDsKfQoKaW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCnsKCXByaW50ZigidGVzdF9jIFJlc3VsdDogJWZcbiIsIHRlc3QodGVzdF9jKSApOwoJcHJpbnRmKCJ0ZXN0X2NwbHVzcGx1cyBSZXN1bHQ6ICVmXG4iLCB0ZXN0KHRlc3RfY3BsdXNwbHVzKSApOwoJcHJpbnRmKCJ0ZXN0X2MyIFJlc3VsdDogJWZcbiIsIHRlc3QodGVzdF9jMikgKTsKCglnZXRjaGFyKCk7CglyZXR1cm4gMDsKfQoK