洛谷 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);//右区间
}
基本思想:递归。每次递归都将待排数组拆分成两份,左份中的元素均比右份小,直到递归到每份中只有一个元素,则此时所有元素均有序;
关键:找到一个在中点左边且比中点值大的点,再找到一个在中点右边且比中点值小的点,然后交换这两个点的位置,使其满足左区间均小于中点,右区间均大于中点。
代码如下:
//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);//右区间
}
相关文章推荐
- 洛谷 P1177 【模板】快速排序
- 洛谷 P1177 【模板】快速排序【13种排序模版】
- 洛谷P1177 【模板】快速排序
- 【排序】洛谷 P1177 【模板】快速排序
- 洛谷 P1177 【模板】快速排序
- 洛谷 P3806 【模板】点分治1
- 洛谷 2068 线段树模板:单点更新,区间求和
- 洛谷 P3369 【模板】普通平衡树 (fhq treap)
- 洛谷P3796 【模板】AC自动机(加强版)
- 洛谷试炼场 提高模板-nlogn数据结构
- 洛谷P3389 【模板】高斯消元法
- AC自动机模板【洛谷3796】
- 【洛谷P3383】【模板】线性筛素数
- 【洛谷T580】【模板】template 鸡腿 tarjan找割点
- 洛谷P3366 【模板】最小生成树
- 【洛谷P2722 USACO】 总分 01背包模板
- 洛谷 P3367 【模板】并查集
- 洛谷 P3386 二分图最大匹配模板
- 线性筛——欧拉筛 C++程序实现 洛谷 模板题 P3383
- [洛谷3812]【模板】线性基