算法AcWing 785. 快速排序

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法AcWing 785. 快速排序相关的知识,希望对你有一定的参考价值。

算法概述

快速排序,集于分治的思想。

基本流程:

  1. 确定分界点x。可以随便选,但一般选最左,中间,最右
  2. **划分调整区间。**根据选出的x,让x左边的数都小于等于x,右边的数大于等于x。
  3. 递归处理左右两段。

算法实现

一个粗暴的思路:

  1. 开两个数组a、b;
  2. 扫描区间q。数小于等于x,放入a,否则放入b;
  3. 把a、b放入q。

一个优雅的做法:
双指针法

  1. 两个指针i、j,分别在左右。
  2. i先往中间走,若遇到的数大于等于x则停下,否则一直前移。
  3. 在i停下后j往中间走,若遇到小于等于x的数就停下。
  4. i、j均停下后就交换i、j指向的数字。
  5. 重复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. 快速排序的主要内容,如果未能解决你的问题,请参考以下文章

Acwing785.快速排序

AcWing 785. 快速排序

AcWing 785. 快速排序

快速排序模板 (ACwing.785)

AcWing基础算法课Level-2 第一讲 基础算法

算法基础课相关代码模板