文章目录
-
- 一、手写快排最后两个测试数据超时了,预料之中的事情,因为这个题目考的应该就是`O(n)`的算法
- 二、看题解有人用`STL`的`nth_element`过掉本题,我直接略过这种解法
- 三、快读+快速排序(手写)+`-O2优化` (三者缺一不可)可以过掉此题,但`O(nlogn)`的算法不是预期的解法
- 四、`vector` + `O(n)`的算法有些时候会超时
- 五、换成数组 + `O(n)`的算法,通过了,而且时间很好看
- 六、后记,`O(n)`的算法还需要好好研究,~~我自己没有看懂,自己其实一开始尝试写`O(n)`的算法了,但是总是出错,我也不知道为什么。而且对于函数中的while循环和递归函数,我都理不清楚出口的样子。先背过吧。~~ 已经弄明白了,讲解如下:
- 七、教训
一、手写快排最后两个测试数据超时了,预料之中的事情,因为这个题目考的应该就是O(n)
的算法
二、看题解有人用STL
的nth_element
过掉本题,我直接略过这种解法
三、快读+快速排序(手写)+-O2优化
(三者缺一不可)可以过掉此题,但O(nlogn)
的算法不是预期的解法
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int nums[5000005];
void qsort(int left, int right){
int x = left, y = right, mid = nums[(left+right)>>1];
while(x<=y){
while(nums[x]<mid)x++;
while(mid<nums[y])y--;
if(x<=y){
int tmp = nums[x];nums[x] = nums[y];nums[y] = tmp;
x++;y--;
}
}//left, y, x, right
if(left<y)qsort(left, y);
if(x<right)qsort(x, right);
}
inline int read(){
//快速读入
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}