快速排序模板
题目描述
给定你一个长度为n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例
5
3 1 2 4 5
输出样例
1 2 3 4 5
时间复杂度 O(n * logn)
参考文献 大佬yxc的算法视频
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, a[N];
enum compType {
less = -1,
greate = 1
};
int Compare(int x, int y) {
if (x == y)
return 0;
return (x - y) / abs(x - y);
}
void sort(int l , int r, compType flag) {
if((r == n && r - l < 2) || (r < n && r - l < 1))
return;
int x = a[(l + r) >> 1];
int i = l - 1, j = 0;
(r < n) ? j = r + 1 : j = r;
while(i < j) {
// while(a[++i] < x);
// while(x < a[--j]);
while (Compare(a[++i], x) == flag);
while (Compare(x, a[--j]) == flag);
if(i < j) swap(a[i], a[j]);
}
sort(l, j, flag);
(r < n) ? sort(j + 1, r, flag) : sort(j, r - 1, flag);
}
int main() {
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
sort(0, n, compType::less);
for(int i = 0; i < n; i++) cout << a[i] << " ";
return 0;
}
#include <iostream>
#include <ctime>
using namespace std;
int partition(int* a, int l, int r) {
//int m = a[(r + l) >> 1];
// 获取随机轴点,但是轴点取不到a[r]
int p = a[l + rand() % (r - l)];
int i = l - 1, j = r + 1;
while(i < j) {
do i++; while(a[i] < p);
do j--; while(p < a[j]);
if(i < j) swap(a[i], a[j]);
}
return j;
}
void quickSort(int* a, int l, int r) {
if(r - l < 1) return;
int x = partition(a, l, r);
quickSort(a, l, x);
quickSort(a, x + 1, r);
}
void quick_sort(int* a, int lo, int hi) {
srand((unsigned int)(0));
quickSort(a, lo, hi - 1);
}
int main() {
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++) cin >> a[i];
quick_sort(a, 0, n); // 为了与STL区间使用的习惯一致[0, n)
for(int i = 0; i < n; i++) cout << a[i] << ' ';
cout << endl;
return 0;
}