快排第三第四TLE,咋回事?

P1177 【模板】排序

要随机在 $[l,r]$ 中选择一个元素作为基准点,否则会退化成 $n^2$
by Reunite @ 2024-02-28 22:05:06


@[_TyT](/user/513596) 快排最差的复杂度是$O(n^2)$的,是会超时的。
by Bob1108 @ 2024-02-28 22:05:30


快排是可以卡掉的,合乎新标准规定的 `std::sort` 是卡不掉的(内省排序)。 选基准的时候选两端会被首当其冲地卡掉,因为构造起来十分简单。 即便是随机基准的快排,如果可以不人道地把你程序的种子都给固定住,也是可以卡掉的,虽然没有人真的可以明目张胆这么干。
by Terrible @ 2024-02-28 22:07:45


@[Reunite](/user/377760) @[Bob1108](/user/981437) @[Terrible](/user/195942) 懂了,蟹蟹
by _TyT @ 2024-02-29 07:04:55


@[Terrible](/user/195942) 我基准选的是l+r>>1,并没有直接选a[l],但是我将它swap到了a[l],这样也会被卡啊 代码如下: ``` void qp(int l,int r){ if(l>=r)return ; swap(v[l],v[l+r>>1]); int pivot=v[l]; int i=l;int j=r+1; while(i<j){ do i++;while(i<=j&&v[i]<=pivot); do j--;while(i<=j&&v[j]>=pivot); if(i<j)swap(v[i],v[j]); } swap(v[j],v[l]); qp(l,j-1); qp(j+1,r); } ```
by PerfectLife @ 2024-03-02 12:08:52


|