自己对快速排序模板的理解
关于快排的思想基本是大同小异的,
但是在快排算法的代码具体实现中,则有很大的差别,
尤其是涉及到边界条件,要考虑到很多情况。我个人认为
如果实在不理解每一条代码的意思,也没有关系,先记熟,拿来用再说。
这一题就是要记住快速排序的模板(从小到大排序)
void quick_sort(int q[], int l, int r) //l 和 r 是传入的边界,第一次传入l = 0, r = n - 1
{
if(l >= r) return ; //因为这个快排模板是递归函数,这是跳出递归函数的判定。
l >= r 表示当前的区间顶多只包含一个元素,因此不需要再排序。
int i = l - 1, j = r + 1, x = q[l + r >> 1];
//i, j的初始值分别需要往边界两边扩一下,因为无论如何
都需要先执行 ++ i 和 ++ j, x则代表的是基准元素,在这个模板中
基准元素x 就一直取 q[l + r >> 1] 一定不会有问题。
while (i < j)
{
do {i ++ ;} while (q[i] < x);
do {j -- ;} while (q[j] > x);
//当q[i] = x 、 q[j] = x 的时候 i, j都会停止
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j); //这里其实是可以将j改成i的,下面同理。
quick_sort(q, j + 1, r); 为了方便模板的记忆,以后都写循环右边界j而不写i。
}