1. 概念解释
冒泡排序
在任意有限实数列 (an) 中,对 ai,i∈N 执行以下操作:
- 若 ai>ai+1,i∈N,则交换这两项;
- 若 ai≤ai+1,i∈N,则不进行操作.
当 ai 完成上述操作后,对于索引 i 所在项完成一次冒泡排序. 当索引 n−1 所在项完成上述操作后,为一轮冒泡排序完成,重头开始新一轮冒泡排序.
2. 证明
设任意长度为 n(n∈N∗)的有限实数列为 (an),即 ∀i∈N∗,有 ai∈R.
若 n=1,显然 (an) 为非递减数列.
若 n>1,则有以下证明:
因为 R 为全序集,所以 ∀a,b∈R 可比较,因此 (an) 任意两项间可比较.
设第 k(k∈N)轮冒泡排序后的数列为 (an(k)),其中 (an(0))=(an).
在第一轮冒泡排序时,
对于数列 (an(0)) 中最大的项 aj(0),j∈N∗ 有 ∀i∈N∗,ai(0)≤aj(0),则 aj(0)>aj+1(0),因此 aj(1)=aj+1(0),aj+1(1)=aj(0).
显然,当第一轮冒泡排序结束时,an(1)=aj(0).
对于数列 (an(1)),由冒泡排序定义可知数列最大项 an(1) 已不可进行交换,即 an(1)=an(2)=an(3)=...,即索引 n 所在项不变.
在第二轮冒泡排序时,我们可以将索引 n 所在项排除,构成一个新的长度为 n−1 的有限实数列 (an−1(k)).
设数列 (an−1(1)) 中最大的项为 am(1).
同理可得,当第二轮冒泡排序结束时,an−1(2)=am(1).
因为 an−1(2)≤an(1),根据冒泡排序定义可知,索引 n−1 所在项已不能交换,即索引 n−1 所在项不变.
对于后续轮次的冒泡排序采取同样的做法,则必有项 an−k+1(k) 无法再进行交换.
根据冒泡排序定义,索引所在项不变需满足 ai≤ai+1 ,i∈N∗,所以,对于数列 (an−k+1(k),...,an(k)) 也满足上述条件,即数列 (an−k+1(k),...,an(k)) 是非递减数列.
当 n−k+1=2,即 k=n−1 时,项 a2(k) 无法再进行交换. 所以根据上述推导有数列 (a2(k),...,an(k)) 是非递减数列.
此时,a1(k) 因其他项都无法再进行交换而无法交换,根据冒泡排序定义有 a1(k)≤a2(k).
因为数列 (a2(k),...,an(k)) 是非递减数列,又因为 a1(k)≤a2(k),所以数列 (a1(k),...,an(k)),即 (an(k)) 是非递减数列.
所以,当 n>1 时,数列 (an) 在经过 n−1 轮冒泡排序后形成非递减数列.
综上,对于任意长度为 n(n∈N∗)的有限实数列 (an),可以通过有限次冒泡排序得到一个非递减数列,即有限实数列进行有限次冒泡排序后的结果必为非递减数列.
Q.E.D