前言
在落谷刷题的时候刷到一题需要自己写快排,对时间跟空间限制都有一定的要求。本人再查看题解的时候发现了一个大佬写的代码,通俗易懂,性能还很好,于是我想分享一下(代码有根据本人习惯稍加改动)。
这个代码结合了二分跟快排的思想
- 每次将 左边比中间数大的元素 与 右边比中间数小的元素 交换,直至左区域的数都比中间数小,右区域的数都比中间数大。
- 将左、右区域都分别执行第一步。
- 直到所有数都排好
具体代码如下:
#include<iostream>
using namespace std;
int a[100001], n;
void QuickSort(int l, int r){
if (l >= r) return;
int i = l, j = r;
// 取中间数放在第0个位置
a[0] = a[(i + j) / 2];
// 取等号是为了让奇偶的情况一致
while (i <= j){
while (a[i] < a[0]) i++; // 找到左边第一个比中间数大的数的下标
while (a[j] > a[0]) j--; // 找到右边第一个比中间数小的数的下标
// 交换这两个数, 交换完之后两个下标都要接着移动
if (i <= j) swap(a[i++], a[j--]);
}
// 【注意】出了循环之后 j在中间数的上一个位置,i在下一个位置
if (l < j) QuickSort(l, j); // 排序左区间的数
if (r > i) QuickSort(i, r); // 排序右区间的数
}
int main(){
cin >> n;
for (int i = 1; i <= n; i++){
cin >> a[i];
}
QuickSort(1, n);
for (int i = 1; i <= n; i++){
cout << a[i];
if (i == n) cout << endl;
else cout << " ";
}
return 0;
}