快速排序和选择模版类
template < typename T >
void insert_sort ( T * array, int start, int end)
{
for ( int i = start + 1 ; i < end + 1 ; ++ i) {
int j = i - 1 ;
T key = array[ i] ;
while ( j >= start && key < array[ j] )
{
array[ j+ 1 ] = array[ j] ;
j-- ;
}
array[ j+ 1 ] = key;
}
}
template < typename T >
KeyValuePair partition ( T * array, int start, int end , const T key)
{
KeyValuePair line ( start- 1 , start- 1 ) ;
for ( int i = start; i < end + 1 ; ++ i) {
if ( array[ i] < key)
{
line. key++ ;
line. value++ ;
T temp = array[ i] ;
array[ i] = array[ line. value] ;
array[ line. value] = array[ line. key] ;
array[ line. key] = temp;
}
else if ( array[ i] == key)
{
line. value++ ;
array[ i] = array[ line. value] ;
array[ line. value] = key;
}
}
return line;
}
template < typename T >
T select ( T* array, int start, int end, int index)
{
if ( start == end) return array[ start] ;
const int constant_num = 5 ;
int remainder = ( end - start + 1 ) % constant_num;
int zero = remainder == 0 ? 0 : 1 ;
int num = ( end - start + 1 ) / constant_num + zero;
T * median = new T[ num] ;
if ( remainder)
{
insert_sort< T> ( array, start + ( num - 1 ) * constant_num, start + ( num - 1 ) * constant_num + remainder- 1 ) ;
median[ num- 1 ] = array[ start + ( num - 1 ) * constant_num + ( remainder - 1 ) / 2 ] ;
}
for ( int i = 0 ; i < num - zero; ++ i) {
insert_sort< T> ( array, start + i * constant_num, start + ( i+ 1 ) * constant_num - 1 ) ;
median[ i] = array[ start + i * constant_num + constant_num / 2 ] ;
}
T key = select< T> ( median, 0 , num- 1 , num/ 2 + ( num % 2 == 0 ? 0 : 1 ) ) ;
delete [ ] median;
int middle = partition< T> ( array, start, end, key) . value;
int position = middle - start + 1 ;
if ( index == position)
{
return array[ middle] ;
}
else if ( index < position)
{
return select< T> ( array, start, middle- 1 , index) ;
}
else
{
return select< T> ( array, middle + 1 , end, index - position) ;
}
}
template < typename T >
void quick_sort ( T * array, int start, int end)
{
if ( start< end)
{
T median = select< T> ( array, start, end, ( end - start + 1 ) / 2 + ( end - start + 1 ) % 2 ) ;
KeyValuePair middle_line = partition< T> ( array, start, end, median) ;
quick_sort< T> ( array, start, middle_line. key) ;
quick_sort< T> ( array, middle_line. value + 1 , end) ;
}
}
KeyValuePair类链接