算法模板:快速排序【沈七】

前言

唤我沈七就好。

往期专栏:
暴力搜索之DFS
暴力搜索之BFS

基本概念

快速排序(Quick sort)是对冒泡排序的一种改进。
理想的时间复杂度是:nlogn,最坏的情况会到n^2。

算法思想

快速排序采用的是分治的思想,用递归的方式来处理子问题。
即将一个区间不断的划分最后将每一个小区间都用相同的排序规则排好序,整个区间也就排序完毕了。
觉得比较抽象的话,可以看下图来帮助理解。(来源:五分钟学算法)
在这里插入图片描述

常用模板

伪代码模板

1 .找到一个分界点 x,将区间分成左右两边。
	 x 可以是边界也可以是正中间都是可以的。
2 .使得左边区间都小于等于 x ,右边区间都大于等于 x 。
	实现方法:双指针。
	分别让放在左右端点的指针向中间移动。
	左指针不断右移,当左指针指向的元素不小于x时停止移动。
	右指针开始左移,当右指针指向的元素不大于x时停止移动。
	交换两个指针指向的元素。
	左指针继续移动,不断重复这个流程直到两个指针相遇。
3 .递归处理左右两边。

C++模板

#include<bits/stdc++.h>
using namespace std;
int a[100010];
void quick_sort(int a[],int l , int r)
{
    
    
	if(l>=r)return ;
	如果只有一个元素就返回
	int x = a[l+r>>1],i = l - 1,j = r + 1;
	定义边界,这里我习惯选正中间。
	while(i<j)
	{
    
    
		do
		i++;while(a[i]<x);
		左指针不断右移,当左指针指向的元素不小于x时停止移动。
		do
		j--;while(a[j]>x);
		右指针开始左移,当右指针指向的元素不大于x时停止移动。
		if(i<j)
		swap(a[i],a[j]);
		交换两个指针指向的元素。
	}
	quick_sort(a,l,j);递归处理左区间。
	quick_sort(a,j+1,r);递归处理右区间。
}
int main()
{
    
    
	int n;
	cin>>n;
	for(int i = 1 ; i <= n ; i ++)
	cin>>a[i];
	quick_sort(a,1,n);
	for(int i = 1 ; i <= n ; i ++)
	cout<<a[i]<<" ";
	return 0;
}

完结散花

ok以上就是对 快速排序 的全部讲解啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。

参考文献

https://www.acwing.com/activity/content/19/

猜你喜欢

转载自blog.csdn.net/m0_66139206/article/details/123413185
今日推荐