P1923 求第 k 小的数
题目如图所示 原本是在PTA上遇到这个题的,但是PTA没有搜索功能
思路:分治+快读(时间复杂度O(n))
先进行算法时间复杂度的分析,这道题目是不能直接用快速排序的,快速排序的平均复杂度为O(nlogn),但是在序列高度有序的情况下快速排序的时间复杂度O(n2),这道题的时间限制是1s(PTA上的时间卡的更紧,只有170ms,但是PTA的数据规模只有1e6),计算机1s内最多进行1e9次运算,快速排序在最坏的情况下要进行2.5*10^12次运算。也就是说用快速排序百分百会超时。
到这里我们就不用考虑用排序来解这道题,而采用分治策略,每次分治后序列的长度都会减少,时间复杂度成线性变化,总时间复杂度为O(n)。
这里附上AC代码
#include<stdio.h>
#define INF 5000000
int a[INF+5],k;
void quicksort(int l,int r)
{
int i=l,j=r;
int mid=a[i];//设置关键字
if(<