#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <stdint.h>
#include <sys/time.h>
#define ELEMS 10000000
#define TOPSS 300000
typedef double val_t;
inline static double baka_sec_count(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
return (double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0);
}
inline static uint32_t rand32() {
static uint32_t y = 2463534242;
y = y ^ (y << 13);
y = y ^ (y >> 17);
return y = y ^ (y << 15);
}
inline static uint64_t rand64(void) {
static uint64_t x = 88172645463325252ULL;
x = x ^ (x << 13);
x = x ^ (x >> 7);
return x = x ^ (x << 17);
}
inline static val_t* alloc_data(int n_) {
val_t
* p
= (val_t
*)malloc(sizeof(val_t
) * n_
);
for (int i = 0; i < n_; ++i) {
p[i] = rand64();
}
return p;
}
inline static val_t* alloc_saiaku_data(int n_) {
val_t
* p
= (val_t
*)malloc(sizeof(val_t
) * n_
);
for (int i = 0; i < n_ / 2 ; ++i) {
p[i] = i;
}
for (int i = n_ / 2; i < n_; ++i) {
p[i] = n_ - i;
}
return p;
}
inline static void free_data(double* p_) {
}
inline static val_t* partition(val_t* p_left_, val_t* p_right_) {
val_t* const p_pivot = p_left_ + (rand32() % (p_right_ - p_left_));
val_t tmp;
tmp = *p_pivot; *p_pivot = *p_right_; *p_right_ = tmp;
val_t const* const p_prev_right = p_right_ - 1;
for (val_t* p = p_left_; p < p_prev_right; ++p) {
if (*p > *p_right_) {
tmp = *p; *p = *p_left_; *p_left_ = tmp;
++p_left_;
}
}
tmp = *p_right_; *p_right_ = *p_left_; *p_left_ = tmp;
return p_left_;
}
inline static void quickselect(val_t* p_left_, val_t* p_right_, val_t* k_) {
while (p_left_ < p_right_) {
val_t* p_pivot = partition(p_left_, p_right_);
if (p_pivot > k_) {
p_right_ = p_pivot + 1;
} else if (p_pivot < k_) {
p_left_ = p_pivot + 1;
} else {
break;
}
}
}
int main(int argc, char* argv[])
{
val_t* p1 = alloc_data(ELEMS);
val_t* p2 = alloc_saiaku_data(ELEMS);
double s;
double e;
s = baka_sec_count();
quickselect(p1, p1 + ELEMS - 1, p1 + TOPSS - 1);
e = baka_sec_count();
fprintf(stdout
, "turnaround time ::= %.04lf sec\n", e
- s
);
s = baka_sec_count();
quickselect(p2, p2 + ELEMS - 1, p2 + TOPSS - 1);
e = baka_sec_count();
fprintf(stdout
, "turnaround time ::= %.04lf sec\n", e
- s
);
free_data(p1);
free_data(p2);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1lbW9yeS5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgoKI2RlZmluZSBFTEVNUyAxMDAwMDAwMAojZGVmaW5lIFRPUFNTIDMwMDAwMAoKdHlwZWRlZiBkb3VibGUgdmFsX3Q7CgppbmxpbmUgc3RhdGljIGRvdWJsZSBiYWthX3NlY19jb3VudCh2b2lkKSB7CiAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwoJcmV0dXJuIChkb3VibGUpdHYudHZfc2VjICsgKChkb3VibGUpdHYudHZfdXNlYyAvIDEwMDAwMDAuMCk7Cn0KCmlubGluZSBzdGF0aWMgdWludDMyX3QgcmFuZDMyKCkgewoJc3RhdGljIHVpbnQzMl90IHkgPSAyNDYzNTM0MjQyOwoJeSA9IHkgXiAoeSA8PCAxMyk7Cgl5ID0geSBeICh5ID4+IDE3KTsKCXJldHVybiB5ID0geSBeICh5IDw8IDE1KTsKfQoKaW5saW5lIHN0YXRpYyB1aW50NjRfdCByYW5kNjQodm9pZCkgewoJc3RhdGljIHVpbnQ2NF90IHggPSA4ODE3MjY0NTQ2MzMyNTI1MlVMTDsKCXggPSB4IF4gKHggPDwgMTMpOwoJeCA9IHggXiAoeCA+PiA3KTsKCXJldHVybiB4ID0geCBeICh4IDw8IDE3KTsKfQoKaW5saW5lIHN0YXRpYyB2YWxfdCogYWxsb2NfZGF0YShpbnQgbl8pIHsKCXZhbF90KiBwID0gKHZhbF90KiltYWxsb2Moc2l6ZW9mKHZhbF90KSAqIG5fKTsKCglmb3IgKGludCBpID0gMDsgaSA8IG5fOyArK2kpIHsKCQlwW2ldID0gcmFuZDY0KCk7Cgl9CgoJcmV0dXJuIHA7Cn0KCmlubGluZSBzdGF0aWMgdmFsX3QqIGFsbG9jX3NhaWFrdV9kYXRhKGludCBuXykgewoJdmFsX3QqIHAgPSAodmFsX3QqKW1hbGxvYyhzaXplb2YodmFsX3QpICogbl8pOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbl8gLyAyIDsgKytpKSB7CgkJcFtpXSA9IGk7Cgl9Cglmb3IgKGludCBpID0gbl8gLyAyOyBpIDwgbl87ICsraSkgewoJCXBbaV0gPSBuXyAtIGk7Cgl9CgoJcmV0dXJuIHA7Cn0KCmlubGluZSBzdGF0aWMgdm9pZCBmcmVlX2RhdGEoZG91YmxlKiBwXykgewoJZnJlZShwXyk7Cn0KCmlubGluZSBzdGF0aWMgdmFsX3QqIHBhcnRpdGlvbih2YWxfdCogcF9sZWZ0XywgdmFsX3QqIHBfcmlnaHRfKSB7CgoJdmFsX3QqIGNvbnN0IHBfcGl2b3QgPSBwX2xlZnRfICsgKHJhbmQzMigpICUgKHBfcmlnaHRfIC0gcF9sZWZ0XykpOwoJdmFsX3QgdG1wOwoJdG1wID0gKnBfcGl2b3Q7ICpwX3Bpdm90ID0gKnBfcmlnaHRfOyAqcF9yaWdodF8gPSB0bXA7CgkKCXZhbF90IGNvbnN0KiBjb25zdCBwX3ByZXZfcmlnaHQgPSBwX3JpZ2h0XyAtIDE7CgoJZm9yICh2YWxfdCogcCA9IHBfbGVmdF87IHAgPCBwX3ByZXZfcmlnaHQ7ICsrcCkgewoJCWlmICgqcCA+ICpwX3JpZ2h0XykgewoJCQl0bXAgPSAqcDsgKnAgPSAqcF9sZWZ0XzsgKnBfbGVmdF8gPSB0bXA7CgkJCSsrcF9sZWZ0XzsKCQl9Cgl9Cgl0bXAgPSAqcF9yaWdodF87ICpwX3JpZ2h0XyA9ICpwX2xlZnRfOyAqcF9sZWZ0XyA9IHRtcDsKCXJldHVybiBwX2xlZnRfOwp9CgppbmxpbmUgc3RhdGljIHZvaWQgcXVpY2tzZWxlY3QodmFsX3QqIHBfbGVmdF8sIHZhbF90KiBwX3JpZ2h0XywgdmFsX3QqIGtfKSB7CgoJd2hpbGUgKHBfbGVmdF8gPCBwX3JpZ2h0XykgewoJCXZhbF90KiBwX3Bpdm90ID0gcGFydGl0aW9uKHBfbGVmdF8sIHBfcmlnaHRfKTsKCQlpZiAocF9waXZvdCA+IGtfKSB7CgkJCXBfcmlnaHRfID0gcF9waXZvdCArIDE7CgkJfSBlbHNlIGlmIChwX3Bpdm90IDwga18pIHsKCQkJcF9sZWZ0XyA9IHBfcGl2b3QgKyAxOwoJCX0gZWxzZSB7CgkJCWJyZWFrOwoJCX0KCX0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewoJdmFsX3QqIHAxID0gYWxsb2NfZGF0YShFTEVNUyk7Cgl2YWxfdCogcDIgPSBhbGxvY19zYWlha3VfZGF0YShFTEVNUyk7Cglkb3VibGUgczsKCWRvdWJsZSBlOwoKCXMgPSBiYWthX3NlY19jb3VudCgpOwoJcXVpY2tzZWxlY3QocDEsIHAxICsgRUxFTVMgLSAxLCBwMSArIFRPUFNTIC0gMSk7CgllID0gYmFrYV9zZWNfY291bnQoKTsKCWZwcmludGYoc3Rkb3V0LCAidHVybmFyb3VuZCB0aW1lIDo6PSAlLjA0bGYgc2VjXG4iLCBlIC0gcyk7CgoJcyA9IGJha2Ffc2VjX2NvdW50KCk7CglxdWlja3NlbGVjdChwMiwgcDIgKyBFTEVNUyAtIDEsIHAyICsgVE9QU1MgLSAxKTsKCWUgPSBiYWthX3NlY19jb3VudCgpOwoJZnByaW50ZihzdGRvdXQsICJ0dXJuYXJvdW5kIHRpbWUgOjo9ICUuMDRsZiBzZWNcbiIsIGUgLSBzKTsKCglmcmVlX2RhdGEocDEpOwoJZnJlZV9kYXRhKHAyKTsKCXJldHVybiAwOwp9Cg==