"Быстрая" сортировка работает в среднем за время O ( n*log(n) ), а в худшем случае за O ( n2 ), но в отличии от сортировки слиянием не требует дополнительного массива. Здесь эта сортировка представлена в виде двух шаблонов. Первый шаблон quickSort123 сортируют элементы массивов по возрастанию: template <class T> ArrRef<T> quickSort123 ( ArrRef<T> & a ) { const nat n = a.size(); if ( n < 2 ) return a; const nat small_size = sizeof(T) > 8 ? 24 : sizeof(T) > 4 ? 40 : 48; CmbSuite<T*, 64> buf; T * lo = a(); T * hi = lo + ( n - 1 ); m1: nat size = ( hi - lo ) + 1; if ( size <= small_size ) { insertSort123 ( ArrRef<T> ( a, lo - a(), size ) ); } else { T * mid = lo + ( size / 2 ); _swap ( *mid, *lo ); T * lo1 = lo; T * hi1 = hi + 1; for (;;) { do { lo1 += 1; } while (lo1 <= hi && *lo1 <= *lo ); do { hi1 -= 1; } while ( hi1 > lo && *hi1 >= *lo ); if ( hi1 < lo1 ) break; _swap ( *lo1, *hi1 ); } _swap ( *lo, *hi1 ); if ( hi1 - 1 - lo >= hi - lo1 ) { if ( lo + 1 < hi1 ) { buf.inc() = lo; buf.inc() = hi1 - 1; } if ( lo1 < hi ) { lo = lo1; goto m1; } } else { if ( lo1 < hi ) { buf.inc() = lo1; buf.inc() = hi; } if ( lo + 1 < hi1 ) { hi = hi1 - 1; goto m1; } } } if ( buf.size() > 0 ) { lo = buf.las(1); hi = buf.las(0); buf.dec(2); goto m1; } return a; }
Второй шаблон quickSort321 сортируют элементы массивов по убыванию и устроен аналогично.
Исходники находятся в файле func1t.h. Наверх |