一、思想
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
二、流程
①确定分界点:q[l],q[(l+r)/2],q[r],随机都行
②调整区间:将小于等于分界点的放分界点左边
将大于等于分界点的放分界点右边
③递归处理左右两端
三、模板
1.c/c++模板
#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;
//确定分界点和指针
int x=q[(l+r)/2],i=l-1,j=r+1;
//调整区间
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);
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;
}
2.Java模板
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i]=in.nextInt(); } quick(a,0,n-1); for (int i = 0; i < n; i++) { System.out.print(a[i]+" "); } } public static void quick(int[] q,int l,int r){ if (l>=r){ return; //判断边界 } int x=q[(l+r)/2],i=l-1,j=r+1;//取分界点和指针 while (i<j){ do { i++; }while (q[i]<x); //如果指针所指的数大于边界就停止 do { j--; }while (q[j]>x);//如果指针所指的数小于于边界就停止 if (i<j){ //两个指针都停止就交换这两个数 int temp=q[i]; q[i]=q[j]; q[j]=temp; } } quick(q,l,j); //递归处理两边 quick(q,j+1,r); } }