算法:快速排序
记录快速排序算法的大概。
快排属于分治算法:
①确定分界点 x,分成子问题;
②递归处理子问题;
③子问题合并(快排这一步不需要操作,但归并排序的核心在这一步骤)
时间复杂度O(nlogn)
#include <bits/stdc++.h>
using namespace std;
//挖坑法 固定基准值left或right
void quicksort(int a[],int left,int right){
if(left>=right) return;
int i=left,j=right,x=a[i];
while(i<j){
while(i<j&&x<=a[j]) j--;
a[i]=a[j];
while(i<j&&x>=a[i]) i++;
a[j]=a[i];
}
a[i]=x;
qicksort(a,left,i-1);
qicksort(a,i+1,right);
}
//三数取中法 基准值取中间
void quicksort(int a[],int left,int right){
int mid=(left+right)/2;//mid=left+(right-left)/2 / >>1
while(left<right){
while(left<right&&a[left]<=a[mid]) left++;
while(left<right&&a[right]>=a[mid]) right--;
if(left<right) swap(a[left],a[right]);
}
quicksort(a,left,mid-1);
quicksort(a,mid+1,right);
}
以下等有空完成:
改进方法:right-left<=5时,可以转成 插排完成 。
非递归方法的快速排序, 用 栈 来实现。