问题描述
快速排序法是比冒泡排序快得多的排序方法,完成快速排序的编写。
输入格式
第一行为n。
接下来n行,每行一个整数。
输出格式
n行,按从小到大排好的顺序,每行个数。
样例输入
5
2
3
4
5
1
样例输出
1
2
3
4
5
数据规模和约定
20%的测试满足:n<=20。
100%的测试满足:n<=100000。
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
void swap(int& a1, int& a2)//交换
{
int temp;
temp = a1;
a1 = a2;
a2 = temp;
return;
}
int Quicksort(int a[], int left, int right) {
int L;
int R;
int midthan;//比较轴,比它小的放它左边,比它大的放在右边。
if (left >= right) {
return 0;//此层递归结束。
}
midthan = a[left];
L = left;
R = right;
while (L != R) {//当L=R的时候说明midthan的左边都比它小或相等,midthan的右边都比它大。那么该层的分配结束。
while (L < R && a[R] >= midthan) {
R--;
}
swap(a[L], a[R]);
while (L < R && a[L] <= midthan) {
L++;
}
swap(a[L], a[R]);
}//该层分配结束后,进入下面更深层次的递归。
Quicksort(a, left, L);//我们规定把比较轴(经过上面的分配后midthan最终的位置序号为L或R)放入此层的左边。
Quicksort(a, L + 1, right);//当然把比较轴放右边也可以。
//当然此时L=R,无论用L还是R都可以,我这里用的是L。
}
int main()
{
int n;
int zll[100003];
cin >> n;
for (int i = 0; i < n; i++)
cin >> zll[i];
Quicksort(zll, 0, n - 1);
for (int i = 0; i < n; i++)
cout << zll[i] << endl;
return 0;
}