Sort
Insertation 直接插入排序
template< class T>
void InsertionSort ( T Data[ ] , int n) {
int p, i;
for ( p = 1 ; p < n; p++ ) {
T temp = Data[ p] ;
i = p- 1 ;
while ( i>= 0 && Data[ i] > temp) {
Data[ i+ 1 ] = Data[ i] ;
i-- ;
}
Data[ i+ 1 ] = temp;
}
}
BinaryInsert 折半插入排序
template< class T>
void BinaryInsertionSort ( T Data[ ] , int n) {
int left, mid, right, p;
for ( p = 1 ; p < n; p++ ) {
T temp = Data[ p] ;
left = 0 ; right = p- 1 ;
while ( left <= right) {
mid = ( left+ right) / 2 ;
if ( Data[ mid] > temp)
right = mid- 1 ;
else
left = mid+ 1 ;
}
for ( int i = p- 1 ; i >= left; i-- )
Data[ i+ 1 ] = Data[ i] ;
Data[ left] = temp;
}
}
Selection 选择排序
template< class T>
void SelectionSort ( T Data[ ] , int n) {
for ( int i = 1 ; i < n; i++ ) {
int k = i- 1 ;
for ( int j = i; j < n; j++ ) {
if ( Data[ j] < Data[ k] )
k= j;
}
if ( k != i- 1 ) {
T t = Data[ k] ;
Data[ k] = Data[ i- 1 ] ;
Data[ i- 1 ] = t;
}
}
}
Bubble 冒泡排序
template< class T>
void BubbleSort ( T Data[ ] , int n) {
for ( int i = 0 ; i < n; i++ ) {
for ( int j = i+ 1 ; j < n; j++ ) {
if ( Data[ j] < Data[ j- 1 ] ) {
T t = Data[ j] ;
Data[ j] = Data[ j- 1 ] ;
Data[ j- 1 ] = t;
}
}
}
}
Merge 归并排序
template< class T>
void Merge ( T Data[ ] , int start, int mid, int end) {
int len1 = mid- start+ 1 , len2 = end- mid;
int i, j, k;
T* left = new T[ len1] ;
T* right = new T[ len2] ;
for ( i = 0 ; i < len1; i++ )
left[ i] = Data[ i+ start] ;
for ( i = 0 ; i < len2; i++ )
right[ i] = Data[ i+ mid+ 1 ] ;
i = 0 ; j = 0 ;
for ( k = start; k < end; k++ ) {
if ( i== len1 || j== len2)
break ;
if ( left[ i] <= right[ j] )
Data[ k] = left[ i++ ] ;
else
Data[ k] = right[ j++ ] ;
}
while ( i < len1)
Data[ k++ ] = left[ i++ ] ;
while ( j < len2)
Data[ k++ ] = right[ j++ ] ;
delete [ ] left;
delete [ ] right;
}
template< class T>
void MergeSort ( T Data[ ] , int start, int end) {
if ( start < end) {
int mid = ( start+ end) / 2 ;
MergeSort ( Data, start, mid) ;
MergeSort ( Data, mid+ 1 , end) ;
Merge ( Data, start, mid, end) ;
}
}
Heap 堆排序
template< class T>
void HeapSort ( T Data[ ] , int n) {
BuildHeap ( Data, n) ;
for ( int i = n- 1 ; i > 0 ; i-- ) {
T t = Data[ 0 ] ;
Data[ 0 ] = Data[ i] ;
Data[ i] = t;
MaxHeap ( Data, 0 , i) ;
}
}
**Quick 快速排序
template< class T>
int Partition ( T Data[ ] , int left, int right) {
T pivot = Data[ left] ;
while ( left < right) {
while ( left< right && Data[ right] > pivot)
right-- ;
Data[ left] = Data[ right] ;
while ( left< right && Data[ left] <= pivot)
left++ ;
Data[ right] = Data[ left] ;
}
Data[ left] = pivot;
return left;
}
template< class T>
void QuickSort ( T Data[ ] , int left, int right) {
if ( left < right) {
int p = Partition ( Data, left, right) ;
QuickSort ( Data, left, p- 1 ) ;
QuickSort ( Data, p+ 1 , right) ;
}