C++ 由Pascal移来的 快排 模板

刚刚做个离散化的题呢 手打快排(我不会说是我不会用sort的) 结果发现出了点问题

虽然我的这个快排和网上的很大不同 网上的看起来还更加厉害 但......太懒了不想学 这个多好~

于是移至某谷的快排模板题 手打了一下 结果......

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]);
				swap(j[x],j[y]);
				++x;
				--y;
			}
		}
	if (x < b) kp(x,b);
	if (a < y) kp(a,y);
}

外面while 必须是 < 不能是<=

里面while 则不加等于 因为数值相同 换了和没换 等价(而且换了的话 一些需要换回来的题目的数据还会乱)

里面判断 为防止 x==y 时 死循环 要判断<=

进入子循环时 两数等于就不用了(原本就不用)

盖余之快排且码如此~

猜你喜欢

转载自blog.csdn.net/Frocean/article/details/80894990