@vourdalak
2019-04-22T15:56:47.000000Z
字数 762
阅读 515
CS161
Heap Sort和Merge Sort所能达到的复杂度都是O(nlogn)级别的,这个算法还有可提升的空间吗?有什么可以使它更改进吗?在当前的逻辑中,被允许的运算有:
这样简单的运算就注定它只能是这个级别的。
一个更好的算法必然要求其他的运算,如:
就如同Hash Table一样。
在输入的size足够小时,数字的比较可以由if-else逻辑穷举得到。无需循环,无需递归。
def sort3(a,b,c):
if a<b:
if b<c:
return [a,b,c]
elif a<c:
return [a,c,b]
else:
return [c,a,b]
else:
if a<c:
return [b,a,c]
elif b<c:
return [b,c,a]
else:
return [c,b,a]
从这个比较序列中可以画出一个比较树(Comparision Tree)
[img]
最差情况下要比较三次,平均比较次。
比较树是对if-then-else逻辑的一个速记方式。
可以被理解成是一个具有以下特征的二叉树:
然后这个比较树的最长路径就是最差情况比较次数,平均路径长度就是平均比较次数。
如果排序结果正确的话,在比较树没有两个叶节点是重复的。共有n!个叶节点。
然而一个高度为h的二叉树应该有个叶节点。所以n!向上取整到最近的则k为得出的最差比较次数的最小可能。
结论:所有的比较排序至少需要次比较,所以所有两两比较的排序最低是O()复杂度。