- 主题:一段有意思的排序代码
把数组从小往大按升序排列。下面是伪代码。
for i = 1 to n
do for j = 1 to n
do if A[i] < A[j] then
swap A[i] and A[j]
这段代码完全符合结果。
--来自微水木3.5.11
--
FROM 39.144.39.*
冒泡
--
FROM 223.104.101.*
好多年前我写冒泡排序的时候就这么写过
想从小到大排,所以用的比较是A[i]>A[j]
然后发现竟然结果是降序的
【 在 foliver (Oliver) 的大作中提到: 】
: 把数组从小往大按升序排列。下面是伪代码。
: for i = 1 to n
: do for j = 1 to n
: ...................
--
FROM 111.199.220.*
有意思的点是两重循环都是1 to n?
【 在 foliver 的大作中提到: 】
: 把数组从小往大按升序排列。下面是伪代码。
: for i = 1 to n
: do for j = 1 to n
: ...................
--
FROM 86.168.118.*
有意思的地方是,这实际上是一个错误实现的冒泡排序,却得到了正确的结果。
【 在 SHENOK (石室食士) 的大作中提到: 】
: 有意思的点是两重循环都是1 to n?
--
FROM 111.199.220.*
【 在 foliver 的大作中提到: 】
: 把数组从小往大按升序排列。下面是伪代码。
: for i = 1 to n
: do for j = 1 to n
: ...................
这是沉底,不是冒泡。证明还挺麻烦的
--
FROM 111.206.145.*
可以数学归纳法证明
【 在 leslin 的大作中提到: 】
:
: 这是沉底,不是冒泡。证明还挺麻烦的
--
FROM 180.165.131.*
当 i = 1,2,...,n 时,都会在 j = 1 时执行 a[i] < a[1] 比较,从而数组的最小值最终会交换到 a[1].
接下来需要证明 a[k] 的位置最终放置的是第 k 小的值,还没想好怎么证明。
【 在 foliver (Oliver) 的大作中提到: 】
: 把数组从小往大按升序排列。下面是伪代码。
: for i = 1 to n
: do for j = 1 to n
: ...................
--
FROM 103.90.178.*
我对 i 这层循环演算了一下,初步明白怎么回事了。
i = 1 时,内层循环 j = 1 to n 把最大值移到了 a[1].
i > 1 时,可以证明循环开始时最大的数位于 a[i-1] 从而 j 到了 i-1 的时候,会将最大的数移到 a[i],从而后面的比较 a[i] < a[j] 都为 false. 于是这个两层循环等价于以下的代码。
// i = 1
for j = 1 to n
if a[j] > a[1]
swap a[j],a[1]
for i = 2 to n
for j = 1 to i - 1
if a[j] > a[i]
swap a[j],a[i]
之后只需要研究后面这个算法的性质就行了。
更新:基本搞明白了,这其实就是个插入排序,看我后面的帖子。
【 在 foliver (Oliver) 的大作中提到: 】
: 把数组从小往大按升序排列。下面是伪代码。
: for i = 1 to n
: do for j = 1 to n
: ...................
--
修改:ArchLinux FROM 103.90.178.*
FROM 103.90.178.*
另外一个版有人贴过,源于这个paper
https://arxiv.org/abs/2110.01111
--
FROM 61.48.128.*