快速排序
什么是快速排序呢?
百度百科是这么介绍的:快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
核心思想:
分治, 先找到一个分界点,然后分区使得左分区 left <= x, 右分区 right >= x, 然后递归处理左右分区
上题目:
那么根据快排的核心思想,我们可以根据以下三个步骤解题
步骤1:初始化i=l-1,j=r+1,参照值为x = q[(l + r)/1]
步骤2:双指针从两侧开始找,i指针寻找第一个不满足q[i]<x的位置,j指针遵照第一个不满足q[j]>x的位置
如果满足i<j则交换q[i]和q[j]
步骤3:递归调用前后两部分。
也可以看看动态图👇👇
话不多说直接上代码:
void quick_sort(int q[],int l,int r){
if(l>=r) return;
int i=l-1,j=r+1
int x=q[(l+r)/2];
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);
代码解释:
l和r分别为对数组q[]进行排序的起始位置。
当l>=r时,函数直接返回。
因为后面部分先执行i++,j–-才进行其他操作,所以初始值设为l-1和r+1。
x的值可以取为q[l]、q[r]、或者数组中的任意一值。但是推荐取参考值为q[(l+r)/2],因为这样可以避免一些复杂的边界问题。
当i<j时,使得q[i]左边的数小于x,q[j]右边的数大于x。当i和j都到达不满足大小判断条件的位置时,在满足i<j的条件下a[i]、a[j]互相交换位置。
接着分别递归左、右两段区间直到整个数组有序。
快速排序有很多种写法,但我们只要会熟练使用一种就好了!、