快速排序算法是一种简单的双指针算法应用
其核心思想是“分治”,再利用递归的方法即可简单完成排序
大致实现步骤为:
1.首先选取当前“块”([l , r])中的“标兵”数字(a[mid]),以标兵为基准,目的是当前“块”quick_sort后,以“标兵”为分界线,其左边的所有数均小于等于“标兵”,右边的数均大于等于“标兵”。
2.以“标兵”所在位置序号(mid)为界,将目前“块”([l, r])一分为二(即“分治”)为[l , mid] 和 [mid + 1, r],再分别对两块进行步骤一quick_sort。
3.设置递归结束条件,当“块”大小为1时,结束递归,返回(即当 l >= r 时,结束递归)。
代码模板:
// 利用分治的思想
// q 是待排序的数组
void quick_sort(int q[], int l, int r){
if (l >= r)
return; //当区间长度等于 1 时递归结束
int x = q[(l + r) / 2]; int i = l - 1; int j = r + 1; //选好标兵, 以及左右起始点
// x 为选择的标兵 , 这里选择的是每个区间的中间数字
// i , j 是我们设置的双指针
// 其中 i 从区间的左端开始 , 作用是找到大于等于标兵的数字 , 即不满足排序目的的数字
// 其中 j 从区间的右端开始 , 作用是找到小于等于标兵的数字
// 每次 while 的作用是 , 分别找到标兵两边不满足排序目的的数字 , 并将其交换顺序使得满足条件
// 循环结束的条件是 i >= j 时循环结束
// 即当标兵
// 左端的所有数字均小于等于标兵 , 且右端的所有数字均大于等于标兵时结束
while(i < j){
do i++; while(q[i] < x); //从左至右遇到第一个大于等于标兵的数时停止
do j--; while(q[j] > x); //从右至左遇到第一个小于等于标兵的数时停止
if (i < j) swap(q[i], q[j]); //交换两个数的位置
}
// 接下来细分区间 , 继续分治
quick_sort(q, l , j); //继续分治
quick_sort(q, j + 1, r); //继续分治
}