快速排序—>分治
背景
快速排序是十大排序之一
十大排序:
快排原理与过程
快速排序是通过选取一个随机值 x 进行运用双指针算法从两端遍历
每一次遍历有两个指针
i 与 j
i 从区间左端开始
j 从区间右端开始
每当arr[i] > x时,i 遍历停止
每当arr[i] < x时,j 遍历停止
两边停止时交换数据使得
x左边区间全部小于等于x
x右边区间全部大于等于x
最后调用递归、使所有区间进行排序。
图形展示
取随机点的值为x
使用双指针算法
使得q值左边的值小于等于x,x值右边的值大于等于x
区间不一定以中间分开
双指针算法简介
两种常用的的双指针
用法一:在一个数组创建两个指针
用法一:在两个数组创建两个指针
核心思想
是将循环
for (int i = 0; i < n;i++)
for(int j = 0; j < n;i++)
算法复杂度为O(n^2) 转化为O(n)
for(int i = 0, j = 0; i < n;i++)
快排模板
步骤:
1、确定分界点:一般取 q[ l ] 、 q[ r ] 、 q[ (r + l ) / 2]
tips: l 为区间左端点, r 为区间右端点
2、调整区间:
使得q值左边的值小于等于q,q值右边的值大于等于q
3、调用递归使得数组排序
当 int x = arr[(l+r+1 >> 1)];或int x = arr[r];时
quickSort(arr , l , i - 1