排序算法的传递性
如果有{甲, 乙, 丙} 三个对象, 规定:
甲>乙
乙>丙
丙>甲
则: 这种排序没有传递性
排序算法的传递性证明
如果
a.b<=b.a, 则a放在前面, 否则 b放在前面
则, 根据排序算法的传递性:
数组中的元素根据字典序排序以后:
[…前…后…]
任何两个元素结合, 则应该有:
前.后 <= 后.前
证明
已知:
⎩⎪⎪⎨⎪⎪⎧a.b<=b.ab.c<=c.b
求证:
a.c<=c.a
字符串"ks" 拼接 字符串 “te” 组成新串 “kste”, 我们认为字符串就是K进制的正数, "kste"是一个四位数, "ks"占据高位, "te"占据低位, 则:
kste=ks∗262+te
认为是k进制数:
a∗b=a∗kb的长度+b
定义:
kx长度=m(x), 则:
⎩⎪⎪⎨⎪⎪⎧a.b<=b.a⇒a∗m(b)+b<=b∗m(a)+ab.c<=c.b⇒b∗m(c)+c<=c∗m(b)+b①②
①两边同时 −b 再 ∗c则有:
a∗m(b)∗c<=b∗m(a)∗c+a∗c−bc
②两边同时 −b 再 ∗a则有:
b∗m(c)∗a+c∗a−b∗a<=c∗m(b)∗a
由上面两式, 可以得到:
b∗m(a)∗c+a∗c−b∗c>=b∗m(c)∗a+c∗a−b∗a
⇒
b∗m(a)∗c−b∗c>=b∗m(c)∗a−b∗a
⇒
m(a)∗c−c>=m(c)∗a−a
⇒
a.c<=c.a
任何一个在前的跟一个在后的交换不会得到更大的字典序
[...a...b...]
假设a,b中有两个字符串, m1,m2, 即:
[...am1m2b...],则任何一个在前的a,跟在后的b交换顺序, 拼起来的新的字符串的字典序一定比之前要大
[...bm1m2a...]
证明
原序列中顺序为am1m2b, 我们把a跟m1交换顺序得到:
[...m1am2b...]
即: a.m1<=m1.a, 后面没有改变,则有:
[...m1am2b...]>=[...am1m2b...]
我们继续交换a跟m2,
即: a.m2<=m2.a
则有:
[...m1m2ab...]>=[...m1am2b...]
我们继续交换a跟b,
则有:
[...m1m2ba...]>=[...m1m2ab...]
将b跟m2,m1依次交换, 由上相同可得:
[...bm1m2a...]>=[...am1m2b...]