diff --git a/schwab_sort.h b/schwab_sort.h index 81e069a..f287883 100644 --- a/schwab_sort.h +++ b/schwab_sort.h @@ -127,9 +127,30 @@ static inline void schwab_sort( int r0 = schwab_pick_pivot(state, (high + 1) - low) + low; int r1 = schwab_pick_pivot(state, (high + 1) - low) + low; - int plo = (r0 < r1) ? r0 : r1; - int phi = (r0 < r1) ? r1 : r0; - int pmid = schwab_pick_pivot(state, (phi + 1) - plo) + plo; + uint32_t k0 = array[r0]; + uint32_t k1 = array[r1]; + int plo = r0; + int phi = r1; + if(k0 > k1) { + plo = r1; + phi = r0; + uint32_t tmp = k0; + k0 = k1; + k1 = tmp; + } + + int r2 = schwab_pick_pivot(state, (phi + 1) - plo) + plo; + uint32_t k2 = array[r2]; + int pmid = r2; + if(k2 < k0) { + int tmp = plo; + plo = pmid; + pmid = tmp; + } else if(k2 > k1) { + int tmp = phi; + phi = pmid; + pmid = tmp; + } schwab_partition(array, low, high, &plo, &pmid, &phi);