T325337 【模板】快速排序
题目描述
利用快速排序算法将读入的 N 个数从小到大排序后输出。
快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL
,虽然你可以使用 sort
一遍过,但是你并没有掌握快速排序算法的精髓。)
输入格式
第 11 行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数,数据保证了 ai 不超过 109109。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1
5 4 2 4 5 1
输出 #1
1 2 4 4 5
说明/提示
对于 20%20% 的数据,有 N≤103;
对于 100%100% 的数据,有 N≤105。
题解
快排是通过多次比较和交换来实现的排序。首先设定一个分界值,通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组的右边,将小于分界值的数据集中到数组的左边。这样就能使得左边部分都小于或等于分界值,右边部分都大于等于分界值。
接着,对左右两边的数据,可以再分别选择一个新的分界值,并重复之前的操作。
经过不断的重复后,排序完成。
#include <iostream> using namespace std; void Q(int a[],int low,int high) { int i,j; int temp; if(low>=high) return; i=low; j=high; temp=a[i]; while(i<j) { while(i<j&&temp<a[j]) j--; if(i<j) { a[i++]=a[j]; } while(i<j&&a[i]<=temp) i++; if(i<j) { a[j--]=a[i]; } } a[i]=temp; Q(a,low,--j); Q(a,++i,high); } int main() { int n,i; cin>>n; int a[n]; for(i=0;i<n;i++) { cin>>a[i]; } Q(a,0,n-1); for(i=0;i<n;i++) { cout<<a[i]<<" "; } return 0; }