排序算法
1. 冒泡排序
void bubbleSort ( int arr[ ] , int n) {
int flag = 0 ;
for ( int i = 1 ; i <= n - 1 ; i++ ) {
for ( int j = 0 ; j < n - i; j++ ) {
if ( arr[ j] > arr[ j + 1 ] ) {
int temp = arr[ j] ;
arr[ j] = arr[ j + 1 ] ;
arr[ j + 1 ] = temp;
flag = 1 ;
}
}
if ( ! flag) break ;
}
}
2. 选择排序
void selectSort ( int arr[ ] , int n) {
for ( int i = 0 ; i < n; i++ ) {
int min = i;
for ( int j = i + 1 ; j < n; j++ ) {
if ( arr[ j] < arr[ min] ) {
min = j;
}
}
int temp = arr[ i] ;
arr[ i] = arr[ min] ;
arr[ min] = temp;
}
}
3. 插入排序
void insertSort ( int arr[ ] , int n) {
for ( int i = 1 ; i < n; i++ ) {
int temp = arr[ i] , j = i;
while ( j > 0 && temp < arr[ j - 1 ] ) {
arr[ j] = arr[ j - 1 ] ;
j-- ;
}
arr[ j] = temp;
}
}
4. 归并排序
4.1 二路归并(递归)
const int maxn = 100 ;
void merge ( int A[ ] , int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[ maxn] , index = 0 ;
while ( i <= R1 && j <= R2) {
if ( A[ i] <= A[ j] ) {
temp[ index++ ] = A[ i++ ] ;
} else {
temp[ index++ ] = A[ j++ ] ;
}
}
while ( i <= R1) temp[ index++ ] = A[ i++ ] ;
while ( j <= R2) temp[ index++ ] = A[ j++ ] ;
for ( i = 0 ; i < index; i++ ) {
A[ L1 + i] = temp[ i] ;
}
}
void mergeSort ( int A[ ] , int left, int right) {
if ( left < right) {
int mid = ( left + right) / 2 ;
mergeSort ( A, left, mid) ;
mergeSort ( A, mid + 1 , right) ;
merge ( A, left, mid, mid + 1 , right) ;
}
}
4.2 二路归并(非递归)
const int maxn = 100 ;
void merge ( int A[ ] , int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[ maxn] , index = 0 ;
while ( i <= R1 && j <= R2) {
if ( A[ i] <= A[ j] ) {
temp[ index++ ] = A[ i++ ] ;
} else {
temp[ index++ ] = A[ j++ ] ;
}
}
while ( i <= R1) temp[ index++ ] = A[ i++ ] ;
while ( j <= R2) temp[ index++ ] = A[ j++ ] ;
for ( i = 0 ; i < index; i++ ) {
A[ L1 + i] = temp[ i] ;
}
}
void mergeSort ( int A[ ] , int n) {
for ( int step = 2 ; step / 2 <= n; step *= 2 ) {
for ( int i = 0 ; i < n; i += step) {
int mid = i + step / 2 - 1 ;
if ( mid + 1 <= n) {
merge ( A, i, mid, mid + 1 , min ( i + step - 1 , n) ) ;
}
}
}
}
4.3 用sort函数替代merge实现
void mergeSort ( int A[ ] , int n) {
for ( int step = 2 ; step / 2 <= n; step *= 2 ) {
for ( int i = 0 ; i < n; i += step) {
sort ( A + i, A + min ( i + step, n + 1 ) ) ;
}
}
}
5. 快速排序
5.1 总是以A[left]为主元
int partition ( int A[ ] , int left, int right) {
int temp = A[ left] ;
while ( left < right) {
while ( left < right && A[ right] > temp) right-- ;
A[ left] = A[ right] ;
while ( left < right && A[ left] < temp) left++ ;
A[ right] = A[ left] ;
}
A[ left] = temp;
return left;
}
void quickSort ( int A[ ] , int left, int right) {
if ( left < right) {
int pos = partition ( A, left, right) ;
quickSort ( A, left, pos - 1 ) ;
quickSort ( A, pos + 1 , right) ;
}
}
5.2 随机主元
int randPartition ( int A[ ] , int left, int right) {
int p = ( int ) ( round ( 1.0 * rand ( ) / RAND_MAX * ( right - left) + left) ) ;
swap ( A[ p] , A[ left] ) ;
int temp = A[ left] ;
while ( left < right) {
while ( left < right && A[ right] > temp) right-- ;
A[ left] = A[ right] ;
while ( left < right && A[ left] < temp) left++ ;
A[ right] = A[ left] ;
}
A[ left] = temp;
return left;
}
void quickSort ( int A[ ] , int left, int right) {
if ( left < right) {
int pos = randPartition ( A, left, right) ;
quickSort ( A, left, pos - 1 ) ;
quickSort ( A, pos + 1 , right) ;
}
}