慢排算法 & sort 注意事项

现在经常用 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语句 两数等于就不用了(原本就不用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值