快速排序
快排:
主要是 分治的思想:
1、确定分界点, 分界点是随机的 q[l] q[r] q[(l+r)/2]都可以 这三种是常用的 当然也可以 随便搞一个 这个值可是每一个区间的随机值 别死记
注意分界点上的数不一定是x x可能在很奇快的位置
2、把整个区间根据整个分界点划分为二 这个划分为二 是根据所求的是从小到大还是从大到小 如 这里的所有<=分界点的在左边 所有>=分界点的在右边
这个数和x相等的话 在左边和右边其实都是可以的
3、递归处理左右两边 当无限个左右两边都排好序了 就整个区间就排好序了
enen 脑子里想一想画面;
具体的代码:
#include<iostream>
using namespace std;
const int x=1e6;
int arr[x],n;
void q(int arr[],int l,int r)
{
if(l==r)return;
int x=arr[(l+r)/2],i=l-1,j=r+1;
while(i<j)
{
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j)swap(arr[i],arr[j]);
}
q(arr,l,j);
q(arr,j+1,r);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>arr[i];
q(arr,0,n-1);
for(int i=0;i<n;i++)cout<<arr[i]<<' ';
return 0;
}
注意细节:
1、边界问题
2、i左边的 一定是<=x的 j右边的一定是>=x的 因此当两个指针相遇 或者穿过之后仍是这样
设置 if(i<j)swap(arr[i],arr[j]);的原因 防止i,j穿过后再进行交换