快速排序之quick_sort()

参考:

AcWing 785. 快速排序_MangataTS的博客-CSDN博客

题目:

活动 - AcWing

基本思路:(分治的思想)

一、确定分界点:q[l] , q[(l+r)/2] , q[r],或者随机挑一个值。

 二、划分区间,调整。使得第一个区间里的所有数都小于等于x,第二个区间的所有数大于等于x。

分界点上的数不一定是x.

三、递归左右两边。

关键点:划分区间

暴力处理

使用两个数组a[],b[]。将q[]中小于等于x的放进a[]中,大于x的放在b[]中。然后就可以创建一个以x分界的数组。

快速排序之quick_sort()_第1张图片

 优美做法:(双指针)

左边的指针指向的数小于等于x,右边的大于等于下,

如果成立各自向中间移动,如果不成立,停在原地。当两个指针都停止时swap(),交换的是指针所指的数,指针不改变。当i,j相遇时,就完成了。

快速排序之quick_sort()_第2张图片

 找一组数据手动模拟一遍容易理解

代码

#include
using namespace std;
const int N = 1e6 +10;

int n;
int q[N];

void quick_sort(int q[],int l,int r)
{
    if(l == r) return;
    
    int x = q[l],i = l-1,j=r+1;//  指向两侧,因为是先往中间移动,然后再比较。
    
    while(ix);
         if(i < j) swap(q[i],q[j]);
    }
    
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}
    
int main(){
    scanf("%d",&n);
    for(int i= 0;i

时间复杂度

最好,最坏,平均

快速排序时间复杂度分析 - 知乎

改进方法

快速排序之quick_sort()_第3张图片

 

你可能感兴趣的:(acwing算法基础课,数据结构)