快速排序(sort)

核心思想为分治

主体步骤:

        1:确定分界点

        2:以分界点为准将数组划分为高低两组(调整区间)

        3:递归执行以上两步

2.gif

                                                                                        (来源:AcWing 785. 快速排序 - AcWing

 1:确定分界点a[n]

        分界点取法多样,通常取  a[ l ] , a[ r ] , a[(l+r)/2] , a[随机],取得a[n]作为分治的分界点。

2:划分两组(调整区间)

        分别扫描a[n]两端数组,以a[n]为分界点,使得左区间<=a[n],右区间>=a[n](左端数组有大于a[n]的就放到右端,右端相反)。

3:递归

        分别递归处理两区间(左端右端再次分治)。

代码实现

#include<iostream>
#include<cstdio>

using namespace std;

int a[100010];

void qsort(int l,int r)
{
	if(l>=r)
	return;
	int i=l-1,j=r+1,x=a[(l+r)/2];	//确定分界点a[x](这里取中间值) 
	while(i<j)									
	{								//扫描左右两段 
		while(a[++i]<x);			//(这里用双指针 i j 优化) 
		while(a[--j]>x);
		if(i<j)
		swap(a[i],a[j]);
	}
	qsort(l,j);						//向下递归左段			
	qsort(j+1,r);					//递归右段 
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	qsort(1,n);
	for(int i=1;i<=n;i++)	printf("%d ",a[i]);
}

 

Guess you like

Origin blog.csdn.net/Dueve_scenputer/article/details/120618624