快速排序
算法思想: 对数组中选取一个值 key进行左右划分,然后对左右俩边部分再次进行同样的递归操作,每次递归总能排序好一个 key。快速排序步骤主要分为两步:1.选取 key,对当前数组进行划分,小于 key 的放左边,大于 key 的放右边。2.递归操作,对 key 左右两边递归 进行相同操作。
手动模拟:
代码实现:
pair<int,int> partition( int arr[], int L, int R ){
int less = L - 1;
int more = R;
while( L < more ){
if( arr[L] < arr[R] ){
swap( arr[++ less], arr[L ++] );
}else if( arr[L] > arr[R] ){
swap( arr[-- more], arr[L] );
}else{
L ++;
}
}
swap( arr[more], arr[R] );
return { less + 1, more };
}
void quickSort( int arr[], int L, int R ){
if( L < R ){
int t = rand()%(R - L + 1) + L; // 这一步是对 选取 key 的值做一个随机的操作,保证不容易出现最差情况
swap( arr[t], arr[R] );
pair<int, int> p = partition( arr, L, R );
quickSort( arr, L, p.first - 1 );
quickSort( arr, p.second + 1, R );
}
}
void quickSort( int arr[], int n ){
if( n <= 1 ){
return ;
}
quickSort( arr, 0, n - 1 );
}