schwab: selection sort trying...
This commit is contained in:
parent
266f489002
commit
c1d152c6f9
@ -17,7 +17,12 @@
|
|||||||
/** Below this many elements we do insertion sort */
|
/** Below this many elements we do insertion sort */
|
||||||
#ifndef SCHWAB_INSERTION_THRESHOLD
|
#ifndef SCHWAB_INSERTION_THRESHOLD
|
||||||
#define SCHWAB_INSERTION_THRESHOLD 128
|
#define SCHWAB_INSERTION_THRESHOLD 128
|
||||||
#endif /* SCHWAB_DELTA_THRESHOLD */
|
#endif /* SCHWAB_INSERTION_THRESHOLD */
|
||||||
|
|
||||||
|
/** Below this many elements we do insertion sort */
|
||||||
|
#ifndef SCHWAB_SELECTION_THRESHOLD
|
||||||
|
#define SCHWAB_SELECTION_THRESHOLD 16
|
||||||
|
#endif /* SCHWAB_SELECTION_THRESHOLD */
|
||||||
|
|
||||||
typedef uint32_t sch_rand_state;
|
typedef uint32_t sch_rand_state;
|
||||||
|
|
||||||
@ -65,7 +70,7 @@ inline void sch_insertion_sort(uint32_t *arr, int low, int high) {
|
|||||||
|
|
||||||
/** Simple insertion sort for small cases v2 - not necessarily better */
|
/** Simple insertion sort for small cases v2 - not necessarily better */
|
||||||
inline void sch_insertion_sort2(uint32_t* arr, int low, int high) {
|
inline void sch_insertion_sort2(uint32_t* arr, int low, int high) {
|
||||||
for(size_t i = low + 1; i <= high; ++i) {
|
for(int i = low + 1; i <= high; ++i) {
|
||||||
uint32_t key = arr[i];
|
uint32_t key = arr[i];
|
||||||
|
|
||||||
/* Separate load and compare to expose ILP */
|
/* Separate load and compare to expose ILP */
|
||||||
@ -81,6 +86,23 @@ inline void sch_insertion_sort2(uint32_t* arr, int low, int high) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Simple SELECTION sort for small cases - not necessarily better */
|
||||||
|
inline void sch_selection_sort(uint32_t* arr, int low, int high) {
|
||||||
|
#pragma GCC unroll 2
|
||||||
|
for(int i = low; i < high; ++i) {
|
||||||
|
/* Min-search remaining array */
|
||||||
|
int mini = i;
|
||||||
|
#pragma GCC unroll 4
|
||||||
|
for(int j = i + 1; j < high + 1; ++j) {
|
||||||
|
if(arr[j] < arr[mini]) mini = j;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mini != i) {
|
||||||
|
schwab_swap(&arr[i], &arr[mini]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 3-way partitioning, in middle all the pivot elements.
|
* 3-way partitioning, in middle all the pivot elements.
|
||||||
*
|
*
|
||||||
@ -316,9 +338,14 @@ static inline void schwab_sort(
|
|||||||
high = plo - 1;
|
high = plo - 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Just do an insertion sort instead */
|
if(high - low > SCHWAB_SELECTION_THRESHOLD) {
|
||||||
sch_insertion_sort(array, low, high);
|
/* Just do an insertion sort instead */
|
||||||
return;
|
sch_insertion_sort(array, low, high);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
sch_selection_sort(array, low, high);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user