schwab insertion - but buggy from some previous at n=20 rand
This commit is contained in:
parent
4c67501511
commit
147ca60672
@ -14,6 +14,11 @@
|
||||
#define SCHWAB_DELTA_THRESHOLD 32
|
||||
#endif /* SCHWAB_DELTA_THRESHOLD */
|
||||
|
||||
/** Below this many elements we do insertion sort */
|
||||
#ifndef SCHWAB_INSERTION_THRESHOLD
|
||||
#define SCHWAB_INSERTION_THRESHOLD 4
|
||||
#endif /* SCHWAB_DELTA_THRESHOLD */
|
||||
|
||||
typedef uint32_t sch_rand_state;
|
||||
|
||||
/** Create rand state for schwab_sort using a seed - can give 0 if uninterested */
|
||||
@ -41,6 +46,22 @@ static inline void schwab_swap(uint32_t *a, uint32_t *b) {
|
||||
*b = t;
|
||||
}
|
||||
|
||||
/** Simple insertion sort for small cases */
|
||||
inline void sch_insertion_sort(uint32_t *arr, int low, int high) {
|
||||
for (int i = low + 1; i <= high; ++i) {
|
||||
uint32_t key = arr[i];
|
||||
int j = i;
|
||||
|
||||
/* Move elements of arr[0..i-1] that are greater than key */
|
||||
/* to one position ahead of their current position */
|
||||
while (j > 0 && arr[j - 1] > key) {
|
||||
arr[j] = arr[j - 1];
|
||||
--j;
|
||||
}
|
||||
arr[j] = key;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 3-way partitioning, in middle all the pivot elements.
|
||||
*
|
||||
@ -221,7 +242,9 @@ static inline void schwab_sort(
|
||||
sch_rand_state *state) {
|
||||
|
||||
/* Loop handles longest sub-sort-task which ensused log tree depth */
|
||||
/* Loop also handles start condition */
|
||||
while(low < high) {
|
||||
if(1 /*high - low > SCHWAB_INSERTION_THRESHOLD*/) {
|
||||
int r0 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
||||
int r1 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
||||
uint32_t klo = array[r0];
|
||||
@ -273,6 +296,11 @@ static inline void schwab_sort(
|
||||
/* low = low; */
|
||||
high = plo - 1;
|
||||
}
|
||||
} else {
|
||||
/* Just do an insertion sort instead */
|
||||
sch_insertion_sort(array, low, high);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user