Compare commits
No commits in common. "95c759b9e3b47829f23598ac1f03303ff085e813" and "4c675015112127721038b58f50e5a93ae5448360" have entirely different histories.
95c759b9e3
...
4c67501511
@ -14,11 +14,6 @@
|
|||||||
#define SCHWAB_DELTA_THRESHOLD 32
|
#define SCHWAB_DELTA_THRESHOLD 32
|
||||||
#endif /* SCHWAB_DELTA_THRESHOLD */
|
#endif /* SCHWAB_DELTA_THRESHOLD */
|
||||||
|
|
||||||
/** Below this many elements we do insertion sort */
|
|
||||||
#ifndef SCHWAB_INSERTION_THRESHOLD
|
|
||||||
#define SCHWAB_INSERTION_THRESHOLD 64
|
|
||||||
#endif /* SCHWAB_DELTA_THRESHOLD */
|
|
||||||
|
|
||||||
typedef uint32_t sch_rand_state;
|
typedef uint32_t sch_rand_state;
|
||||||
|
|
||||||
/** Create rand state for schwab_sort using a seed - can give 0 if uninterested */
|
/** Create rand state for schwab_sort using a seed - can give 0 if uninterested */
|
||||||
@ -46,22 +41,6 @@ static inline void schwab_swap(uint32_t *a, uint32_t *b) {
|
|||||||
*b = t;
|
*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.
|
* 3-way partitioning, in middle all the pivot elements.
|
||||||
*
|
*
|
||||||
@ -187,7 +166,7 @@ static inline int schwab_partition(
|
|||||||
|
|
||||||
arr[b3] = arr[b2];
|
arr[b3] = arr[b2];
|
||||||
arr[b2] = (where == 2) ? arr[b2] : arr[b1];
|
arr[b2] = (where == 2) ? arr[b2] : arr[b1];
|
||||||
arr[b1] = (where >= 1) ? arr[b1] : arr[b0];
|
arr[b1] = (where == 1) ? arr[b1] : arr[b0];
|
||||||
|
|
||||||
++b2;
|
++b2;
|
||||||
b1 += (where < 2);
|
b1 += (where < 2);
|
||||||
@ -242,9 +221,7 @@ static inline void schwab_sort(
|
|||||||
sch_rand_state *state) {
|
sch_rand_state *state) {
|
||||||
|
|
||||||
/* Loop handles longest sub-sort-task which ensused log tree depth */
|
/* Loop handles longest sub-sort-task which ensused log tree depth */
|
||||||
/* Loop also handles start condition */
|
|
||||||
while(low < high) {
|
while(low < high) {
|
||||||
if(high - low > SCHWAB_INSERTION_THRESHOLD) {
|
|
||||||
int r0 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
int r0 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
||||||
int r1 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
int r1 = schwab_pick_pivot(state, (high + 1) - low) + low;
|
||||||
uint32_t klo = array[r0];
|
uint32_t klo = array[r0];
|
||||||
@ -296,11 +273,6 @@ static inline void schwab_sort(
|
|||||||
/* low = low; */
|
/* low = low; */
|
||||||
high = plo - 1;
|
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