fixed thiersort2
This commit is contained in:
parent
a3643eba9b
commit
5a8f34efa0
@ -531,6 +531,7 @@ static inline TSU8 ts_radixi(
|
|||||||
|
|
||||||
/* Should never happen */
|
/* Should never happen */
|
||||||
assert(false);
|
assert(false);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forward decl. */
|
/* Forward decl. */
|
||||||
|
|||||||
21
thiersort2.h
21
thiersort2.h
@ -46,24 +46,25 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Count */
|
/* Count */
|
||||||
#pragma GCC unroll 4
|
#pragma GCC unroll 64
|
||||||
for(int i = 0; i < 256; ++i) {
|
for(int i = 0; i < 256; ++i) {
|
||||||
bucket[i] = 0;
|
bucket[i] = 0;
|
||||||
}
|
}
|
||||||
#pragma GCC unroll 4
|
#pragma GCC unroll 64
|
||||||
for(int i = 0; i < n; ++i) {
|
for(int i = 0; i < n; ++i) {
|
||||||
++bucket[witch_bucket(arr[i])];
|
++bucket[witch_bucket(arr[i])];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prefix sum (like in Magyarsort) */
|
/* Prefix sum (like in Magyarsort) */
|
||||||
uint32_t prev = 0;
|
uint32_t prev = 0;
|
||||||
|
#pragma GCC unroll 4
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
bucket[i] += prev;
|
bucket[i] += prev;
|
||||||
prev = bucket[i];
|
prev = bucket[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save end-offsets */
|
/* Save end-offsets */
|
||||||
#pragma GCC unroll 4
|
#pragma GCC unroll 64
|
||||||
for(int i = 0; i < 256; ++i) {
|
for(int i = 0; i < 256; ++i) {
|
||||||
bucket_end[i] = bucket[i];
|
bucket_end[i] = bucket[i];
|
||||||
}
|
}
|
||||||
@ -98,13 +99,13 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
|
|||||||
uint32_t pivot = temparr[i];
|
uint32_t pivot = temparr[i];
|
||||||
#pragma GCC unroll 4
|
#pragma GCC unroll 4
|
||||||
for(int j = begin + 1; j < end; ++j) {
|
for(int j = begin + 1; j < end; ++j) {
|
||||||
if(temparr[j] == b) {
|
if(temparr[j] == pivot) {
|
||||||
/* swap to front partition */
|
/* swap to front partition */
|
||||||
++i;
|
++i;
|
||||||
uint32_t tmp = temparr[i];
|
uint32_t tmp = temparr[i];
|
||||||
temparr[i] = temparr[j];
|
temparr[i] = temparr[j];
|
||||||
temparr[j] = tmp;
|
temparr[j] = tmp;
|
||||||
} else if(temparr[j] < b) {
|
} else if(temparr[j] < pivot) {
|
||||||
/* copy to left */
|
/* copy to left */
|
||||||
arr[smalli++] = temparr[j];
|
arr[smalli++] = temparr[j];
|
||||||
} else {
|
} else {
|
||||||
@ -113,13 +114,15 @@ static inline void thiersort2(uint32_t *arr, uint32_t *temparr, int n, sch_rand_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Copy the mid elements back */
|
/* Copy the mid elements back */
|
||||||
#pragma GCC unroll 4
|
int target = smalli;
|
||||||
|
#pragma GCC unroll 64
|
||||||
for(int j = begin; j < i + 1; ++j) {
|
for(int j = begin; j < i + 1; ++j) {
|
||||||
arr[smalli++] = temparr[j];
|
arr[target++] = temparr[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call schwabsort */
|
/* Call schwabsort - only to [begin..smalli) and (biggie..end) */
|
||||||
schwab_sort(arr, begin, end - 1, rstate);
|
schwab_sort(arr, begin, smalli - 1, rstate);
|
||||||
|
schwab_sort(arr, biggi + 1, end - 1, rstate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
ypsu.cpp
10
ypsu.cpp
@ -862,6 +862,7 @@ int main(void) {
|
|||||||
//int n = 5000000;
|
//int n = 5000000;
|
||||||
int n = 1000000;
|
int n = 1000000;
|
||||||
//int n = 100000;
|
//int n = 100000;
|
||||||
|
//int n = 20001;
|
||||||
//int n = 20000;
|
//int n = 20000;
|
||||||
//int n = 1000;
|
//int n = 1000;
|
||||||
//int n = 200;
|
//int n = 200;
|
||||||
@ -889,6 +890,7 @@ int main(void) {
|
|||||||
/*
|
/*
|
||||||
w = v;
|
w = v;
|
||||||
measure(inputtype, "ska", [&] { ska_sort(std::begin(w), std::end(w)); });
|
measure(inputtype, "ska", [&] { ska_sort(std::begin(w), std::end(w)); });
|
||||||
|
*/
|
||||||
w = v;
|
w = v;
|
||||||
measure(inputtype, "ska_copy", [&] {
|
measure(inputtype, "ska_copy", [&] {
|
||||||
std::vector<uint32_t> buf(w.size());
|
std::vector<uint32_t> buf(w.size());
|
||||||
@ -896,11 +898,14 @@ int main(void) {
|
|||||||
w.swap(buf);
|
w.swap(buf);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
w = v;
|
w = v;
|
||||||
measure(inputtype, "magyar", [&] { MagyarSort::sort<uint32_t>(&w[0], w.size()); });
|
measure(inputtype, "magyar", [&] { MagyarSort::sort<uint32_t>(&w[0], w.size()); });
|
||||||
assert(w == expected);
|
assert(w == expected);
|
||||||
|
|
||||||
|
w = v;
|
||||||
|
measure(inputtype, "gptbuck", [&] { gpt_bucket_sort(&w[0], w.size()); });
|
||||||
|
assert(w == expected);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
w = v;
|
w = v;
|
||||||
measure(inputtype, "mormord", [&] { mormord_sort(&w[0], w.size()); });
|
measure(inputtype, "mormord", [&] { mormord_sort(&w[0], w.size()); });
|
||||||
@ -925,9 +930,6 @@ int main(void) {
|
|||||||
measure(inputtype, "sp", [&] { spsort(&w[0], w.size()); });
|
measure(inputtype, "sp", [&] { spsort(&w[0], w.size()); });
|
||||||
assert(w == expected);
|
assert(w == expected);
|
||||||
w = v;
|
w = v;
|
||||||
measure(inputtype, "gptbuck", [&] { gpt_bucket_sort(&w[0], w.size()); });
|
|
||||||
assert(w == expected);
|
|
||||||
w = v;
|
|
||||||
measure(inputtype, "gpt_qsort", [&] { gpt_quicksort(w); });
|
measure(inputtype, "gpt_qsort", [&] { gpt_quicksort(w); });
|
||||||
assert(w == expected);
|
assert(w == expected);
|
||||||
w = v;
|
w = v;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user