算法AcWing 785. 快速排序
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法AcWing 785. 快速排序相关的知识,希望对你有一定的参考价值。
算法概述
快速排序,集于分治的思想。
基本流程:
- 确定分界点x。可以随便选,但一般选最左,中间,最右
- **划分调整区间。**根据选出的x,让x左边的数都小于等于x,右边的数大于等于x。
- 递归处理左右两段。
算法实现
一个粗暴的思路:
- 开两个数组a、b;
- 扫描区间q。数小于等于x,放入a,否则放入b;
- 把a、b放入q。
一个优雅的做法:
双指针法。
- 两个指针i、j,分别在左右。
- i先往中间走,若遇到的数大于等于x则停下,否则一直前移。
- 在i停下后j往中间走,若遇到小于等于x的数就停下。
- i、j均停下后就交换i、j指向的数字。
- 重复234,直到i、j相遇为止。
代码
快排核心代码:
void quick_sort(int q[],int l,int r)
{
if(l>=r) return;//i j 相遇
int x=q[l+r>>1],i=l-1,j=r+1; //确定x,中间数,ij开始要在范围外——这样一进去就能比较
//x在最左或最右的可能出现最坏情况
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);//左右递归 可以写i,因为ij左右对称
quick_sort(q,j+1,r);
}
模板题代码:
题
/*
https://www.acwing.com/problem/content/787/
*/
#include<iostream>
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;//i j 相遇
int x=q[l+r>>1],i=l-1,j=r+1; //确定x,中间数,ij开始要在范围外——这样一进去就能比较
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);//左右递归 可以写i,因为ij左右对称
quick_sort(q,j+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&q[i]);
quick_sort(q,0,n-1);
for(int i=0;i<n;i++) printf("%d ",q[i]);
return 0;
}
以上是关于算法AcWing 785. 快速排序的主要内容,如果未能解决你的问题,请参考以下文章