快速排序
- 任取一个记录(如第一个) 为枢轴
- 划分(Partitioning):所有比枢轴小的记录一律前
放,比枢轴大的记录一律后放,形成左右两个子
表 - 对子表重新前两步,直到每个子表的元素只一个。
- 初始化:low 指向第一条记录,high 指向最后一条记录。
- 交替执行下面两步,直至low 等于high,即为枢轴位
置。
(1)从右边扫找到第一个小于枢轴的记录,将其移到左边
(2)从左边扫找到第一个大于枢轴的记录,将其移到右边
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
代码展示
#include<iostream>
using namespace std;
const int N = 1e5+10;
int n;
int q[N];
void quick_sort(int q[],int l,int r)
{
if(l == r) return;
int x = q[(l+r+1)/2],i = l-1,j = r+1;
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,i-1);// (2)从左边扫找到第一个大于枢轴的记录,将其移到右边
quick_sort(q,i,r);//(1)从右边扫找到第一个小于枢轴的记录,将其移到左边
}
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;
}