您的位置:首页 > 其它

洛谷 P1177 快排【模板】

2018-02-25 20:15 302 查看
快排是对冒泡排序的改进,复杂度为O(nlogn),但相较冒泡排序,内部不如冒泡排序稳定;
基本思想:递归。每次递归都将待排数组拆分成两份,左份中的元素均比右份小,直到递归到每份中只有一个元素,则此时所有元素均有序;
关键:找到一个在中点左边且比中点值大的点,再找到一个在中点右边且比中点值小的点,然后交换这两个点的位置,使其满足左区间均小于中点,右区间均大于中点。

代码如下:
//By Acer_mo
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int a[1000000];
void qsort(int,int);
int main()
{
int i,t;
cin>>t;
for (i=1;i<=t;i++)
{
cin>>a[i];
}
qsort(1,t);//开始递归,初始区间为总区间
for (i=1;i<=t;i++)
{
cout<<a[i]<<" ";
}
}
void qsort(int l,int r)
{
int k,j,mid,p;
k=l;j=r;//区间左端点,右端点
mid=a[(l+r)/2];//中点的值
do
{
while (a[k]<mid) k++;//查找中点前比中点大的值
while (a[j]>mid) j--;//查找中点后比中点小的值
if (k<=j)//大点在左小点在右,满足交换条件
{
swap(a[k],a[j]);,交换位置
k++;
j--;
}
}while (k<=j);
if (l<j) qsort(l,j);//递归左区间
if (k<r) qsort(k,r);//右区间
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: