快排

快排采用分治的思想

分治算法都有三步:
1. 分成子问题
2. 递归处理子问题
3. 子问题合并

在数组中任取x,分成大于x,和小于x的两部分,再对这两部分分别进行递归,按从大到小排列,即整个数组的排序完成

可以使用指针进行操作,在两侧分别取指针i,j ,i若大于所指的数则向右移动,j若小于的数则向左移动,如果i小于所指的数,等到j大于所指的数时,两指针的数进行交换,之后继续移动,确保分成大于x,和小于x的两部分

模板    ( 从小到大)

#include<iostream>
using namespace std;
const int N=100000000;
int n;
int q[N];
void quick_sort(int q[],int l,int r)//l,r为边界
{
if(l>=r) return;//判断区间是否存在
int x=q[l + r >> 1],i=l-1,j=r+1;//定义指针,i和j的定义是因为在后面的代码中采用了先移动后交换的做法,i和j 能确保找到真正的边界
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;
}

posted @ 2021-07-29 11:14  YUI唯  阅读(40)  评论(0)    收藏  举报