avatar💤
AoneAoneのBlog

喵~

Aone的Blog,可能有有用的东西?
一个有意思的项目: OGame-Vue-Ts 我已经玩上瘾了!

对任意有限实数列进行有限次冒泡排序的结果必为非递减数列的证明

1. 概念解释

冒泡排序

在任意有限实数列 (an)(a_n) 中,对 aia_iiNi \in \N 执行以下操作:

  1. ai>ai+1a_i > a_{i+1}iNi \in \N,则交换这两项;
  2. aiai+1a_i \le a_{i+1}iNi \in \N,则不进行操作.

aia_i 完成上述操作后,对于索引 ii 所在项完成一次冒泡排序. 当索引 n1n - 1 所在项完成上述操作后,为一轮冒泡排序完成,重头开始新一轮冒泡排序.

2. 证明

设任意长度为 nnnNn \in \N^*)的有限实数列为 (an)(a_n),即 iN\forall i \in \N^*,有 aiRa_i \in \R.

n=1n = 1,显然 (an)(a_n) 为非递减数列.

n>1n > 1,则有以下证明:

因为 R\R 为全序集,所以 a,bR\forall a, b \in \R 可比较,因此 (an)(a_n) 任意两项间可比较.

设第 kkkNk \in \N)轮冒泡排序后的数列为 (an(k))(a_n^{(k)}),其中 (an(0))=(an)(a_n^{(0)}) = (a_n).

在第一轮冒泡排序时,

对于数列 (an(0))(a_n^{(0)}) 中最大的项 aj(0)a_j^{(0)}jNj \in \N^*iN\forall i \in \N^*ai(0)aj(0)a_i^{(0)} \le a_j^{(0)},则 aj(0)>aj+1(0)a_j^{(0)} > a_{j + 1}^{(0)},因此 aj(1)=aj+1(0)a_j^{(1)} = a_{j + 1}^{(0)}aj+1(1)=aj(0)a_{j+1}^{(1)} = a_j^{(0)}.

显然,当第一轮冒泡排序结束时,an(1)=aj(0)a_n^{(1)} = a_j^{(0)}.

对于数列 (an(1))(a_n^{(1)}),由冒泡排序定义可知数列最大项 an(1)a_n^{(1)} 已不可进行交换,即 an(1)=an(2)=an(3)=...a_n^{(1)} = a_n^{(2)} = a_n^{(3)} = ...,即索引 nn 所在项不变.

在第二轮冒泡排序时,我们可以将索引 nn 所在项排除,构成一个新的长度为 n1n - 1 的有限实数列 (an1(k))(a_{n - 1}^{(k)}).

设数列 (an1(1))(a_{n - 1}^{(1)}) 中最大的项为 am(1)a_m^{(1)}.

同理可得,当第二轮冒泡排序结束时,an1(2)=am(1)a_{n - 1}^{(2)} = a_m^{(1)}.

因为 an1(2)an(1)a_{n - 1}^{(2)} \le a_n^{(1)},根据冒泡排序定义可知,索引 n1n - 1 所在项已不能交换,即索引 n1n - 1 所在项不变.

对于后续轮次的冒泡排序采取同样的做法,则必有项 ank+1(k)a_{n - k + 1}^{(k)} 无法再进行交换.

根据冒泡排序定义,索引所在项不变需满足 aiai+1a_i \le a_{i + 1}iNi \in \N^*,所以,对于数列 (ank+1(k),...,an(k))(a_{n - k + 1}^{(k)}, ..., a_n^{(k)}) 也满足上述条件,即数列 (ank+1(k),...,an(k))(a_{n - k + 1}^{(k)}, ..., a_n^{(k)}) 是非递减数列.

nk+1=2n - k + 1 = 2,即 k=n1k = n - 1 时,项 a2(k)a_2^{(k)} 无法再进行交换. 所以根据上述推导有数列 (a2(k),...,an(k))(a_{2}^{(k)}, ..., a_n^{(k)}) 是非递减数列.

此时,a1(k)a_1^{(k)} 因其他项都无法再进行交换而无法交换,根据冒泡排序定义有 a1(k)a2(k)a_1^{(k)} \le a_2^{(k)}.

因为数列 (a2(k),...,an(k))(a_{2}^{(k)}, ..., a_n^{(k)}) 是非递减数列,又因为 a1(k)a2(k)a_1^{(k)} \le a_2^{(k)},所以数列 (a1(k),...,an(k))(a_{1}^{(k)}, ..., a_n^{(k)}),即 (an(k))(a_n^{(k)}) 是非递减数列.

所以,当 n>1n > 1 时,数列 (an)(a_n) 在经过 n1n - 1 轮冒泡排序后形成非递减数列.

综上,对于任意长度为 nnnNn \in \N^*)的有限实数列 (an)(a_n),可以通过有限次冒泡排序得到一个非递减数列,即有限实数列进行有限次冒泡排序后的结果必为非递减数列.

Q.E.D\text{Q.E.D}

QwQNT 第九次社区解谜活动题解与部分源码披露
一个有意思的项目: OGame-Vue-Ts 我已经玩上瘾了!