现在经常用 sort 啦 =w= 我目前唯一用的 STL 的东西 先放一下这个的
注意平时不打 using namespace std 的 这时要加上!
sort 用法大概是这样的 ——> sort(s,s + len,cmp) cmp可加可不加 干嘛用的呢 后面再说
s 是数组 然后 len 是数组长度 (居然还要手打=-=) 但这里要注意这是 0 下标开始排的
因此如果要从 s[1] 排到 s[len] 的话 要改成 sort(s + 1,s + len + 1,cmp)
cmp 是什么呢 答案是 compare (比较) sort 默认给你从小排到大的说=-=
如果要从大到小 就得自己弄个 cmp 函数 像这样
//关于函数类型 事实上 bool 和 int 也可以 本人喜欢用 short
//关于括号里的 网上dalao们都用的是 const int &x 之类 我太懒了=-=
short cmp(int x,int y)
{
return x > y;
}// x < y 就是从小到大 然而那样的话根本不用打这个子程序的说
然后如果结构体要排序呢 就要把部分东西改一下=-= 像这样
struct num {
int id,v;
} s[233];
short cmp(num x,num y) //类型要变
{
return x.v < y.v; //自定义要按照哪个元素比较
}
//当然有时要求某值相同输出编号最小之类的题目 就要像下面这样
short cmp(num x,num y)
{
if (x.v == y.v) return x.id < y.id; //值相同则比较编号
return x.v < y.v;
}
ok 下面是鸡肋般的手打慢排心路历程=-=
做个离散化的题呢 手打快排 结果发现出了点问题 (我不会说是我不会用sort的 2018.8.22 决定改用 sort)
虽然我的这个快排和网上的很大不同 要慢上许多 但......太懒了不想学 这个多好~
又短 又简单 易记 又优美 你看 我还没缩行~ 但是...我怎么TLE和MLE了
于是移至某谷的快排模板题 返璞归真地用Pascal手打了一下 结果......
Pascal记录:
https://www.luogu.org/record/show?rid=8116157
https://www.luogu.org/record/show?rid=8116211
细细思考 反复推敲 终于......
https://www.luogu.org/record/show?rid=8116231
于是发现了几个大问题
Pascal的 这个快排打法 完全是固定的啊=-=
于是放个C++代码记录一下 防止以后搞错
void kp(int a,int b)
{
int x = a,y = b,mid = i[(x + y) >> 1];
while (x <= y)
{
while (i[x] < mid) ++x;
while (i[y] > mid) --y;
if (x <= y)
{
swap(i[x],i[y]);
++x;
--y;
}
}
if (x < b) kp(x,b);
if (a < y) kp(a,y);
}
外面while 必须是 < 不能是<= 虽然我弄不懂为什么相同的时候还要判断 同下还要循环(尴尬)
里面while 必须加等于 虽然我十分弄不懂(再次尴尬)
里面判断 为防止 x==y 时 死循环 要判断<=
关于if里的 ++x 和 --y 一定要放里面不能放外面 否则会错 EG https://www.luogu.org/record/show?rid=8117423
最后两if语句 两数等于就不用了(原本就不用)