- UID
- 2
- 精华
- 76
- 积分
- 7343
- 威望
- 291 点
- 宅币
- 5593 个
- 贡献
- 253 次
- 宅之契约
- 0 份
- 最后登录
- 2024-4-24
- 在线时间
- 948 小时
- QQ
用户组: 真·技术宅
- UID
- 2
- 精华
- 76
- 威望
- 291 点
- 宅币
- 5593 个
- 贡献
- 253 次
- 宅之契约
- 0 份
- 在线时间
- 948 小时
- 注册时间
- 2014-1-25
|
看了东南大学那个算法视频,知道了锦标赛排序算法的原理,在网上搜了一下,实现的比较少代码也不够规范。
先简要说一下原理:锦标赛算法是选择排序改进的,充分利用前面选择最小值的比较步骤,去除后面冗余的比较。比如你在前一遍已经比较出了
a1<a2了,后面你应该想直接用这个结果,而不是再比较一次,因此这些比较值存储于一颗完全二叉树中,这棵树记载了两两比较的结果,这样,
前面比较之后,就可以利用前面的结果进行比较,而且只需要遍历上次改动的一个分支。将最小的节点逐层比较通过0号元素输出,并把这个元素
对应于原数组在二叉树中的位置标记为无穷大,并从该叶节点的父节点开始比较,这样循环直到全部输出为止。原视频中说存储的直接是值,然而
实际操作中发现并不方便,因为根据值不好判断他的索引是什么,去除的时候也不是随便去除而是找你产生最小值的分支进行去除,否则会出错。
我这种方法在二叉树中记录的是索引,元素的去除就会将索引标记为一个特殊的数。如果是内建的排序算法,那么你可以直接吧这个位置并到数组中,
将该索引位置的值赋值为无穷大,但是考虑到通用性,我没有这么做,于是就要判断索引值是否合法了。如果内建的算法的话,效率估计会更高。
代码如下:
|
|