bit_partition function added - its like quicksort, but different
This commit is contained in:
parent
3f0ae7ae77
commit
0f716e912c
27
ypsu.cpp
27
ypsu.cpp
@ -144,6 +144,33 @@ void twopass(uint32_t *a, int n) {
|
|||||||
// --index
|
// --index
|
||||||
// különben
|
// különben
|
||||||
// ++pivot_index
|
// ++pivot_index
|
||||||
|
/**
|
||||||
|
* Divides array into two partitions by its topmost bit.
|
||||||
|
* - Similar to quicksort partitioning, but changed accordingly.
|
||||||
|
* - MSB 0 bit values will come first partition.
|
||||||
|
* - The return value tells partition boundary.
|
||||||
|
*
|
||||||
|
* @param a The array to partition and occurence count.
|
||||||
|
* @param n The length of the array.
|
||||||
|
*/
|
||||||
|
static inline uint32_t bit_partition(uint32_t *a, uint32_t n) noexcept {
|
||||||
|
uint32_t i = -1;
|
||||||
|
uint32_t j = n;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
// Move past well-placed ones
|
||||||
|
do ++i; while (!(a[i] & 0x80));
|
||||||
|
do --j; while (a[j] & 0x80);
|
||||||
|
|
||||||
|
// If the indices crossed, return
|
||||||
|
if(i >= j) return j;
|
||||||
|
|
||||||
|
// Swap badly placed
|
||||||
|
uint32_t tmp = a[i];
|
||||||
|
a[i] = a[j];
|
||||||
|
a[j] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
template<int j>
|
template<int j>
|
||||||
static inline uint32_t morgrab(uint32_t elem) noexcept {
|
static inline uint32_t morgrab(uint32_t elem) noexcept {
|
||||||
return (elem >> (8 * j)) & 0xff;
|
return (elem >> (8 * j)) & 0xff;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user