许多年以后,当他在大厂面试手写快排时,准会想起他领悟快排的那个遥远的晚上
快速排序的时间复杂度是O(nlogn),大多数情况下是最快的排序算法
基本思想:
- 1.选基准数,从数列中选一个数作为基准数(pivot)。
- 2.分治,将比这个数大的数全放到它的右边,比这个数小的数放到它的左边。
- 3.递归,对左右区间重复第二步,直到各区间只有一个数
视频演示

C++示例代码
这个示例是输入n个数对其进行快速排序
#include<iostream>
using namespace std;
int Paritition(int a[], int l, int r);
void QuickSort(int a[], int l, int r);
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
QuickSort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
return 0;
}
int Paritition(int a[],int l,int r)
{
int pivot=a[l];
while(l<r)
{
while(l<r&&a[r]>=pivot)
r--;
a[l]=a[r];
while(l<r&&a[l]<=pivot)·
l++;
a[r]=l;
}
a[l]=pivot;
return l;
}
void QuickSort(int a[],int l,int r)
{
if(l<r)
{
int pivot=Paritition(a,l,r);
QuickSort(a,l,pivot-1);
QuickSort(a,pivot+1,r);
}
}
详细讲解
我这里的代码首先是把pivot设定为左值,实际上可以是随机的
(随机选取pivot在面临大数据时速度会快很多)
我将分治和递归作为单独的函数,使代码更直观
首先我讲讲分治(Paritition)部分
然后使用left和right作为指针,要使right右边的数都比pivot大,所以当a[right]>=pivot时,right--,即是right指针左移,直到无法再左移时,即righrt小于pivot,执行a[left]=a[right]将right和left互换,即将小于pivot的数放到它左边来了, 至于while(left<right&&a[right]>=pivot)中,为何有left<right的判断语句,是因为在移动指针的过程中,可能出现left>right.分治部分排完pivot左右两边的数的顺序后
我再讲递归||
分治执行完后,只要左指针小于右指针就不断递归调用排序pivot左边的序列重新又排一边