我想到了一种排序算法,但我不确定它是否已经存在。
假设我们有一个包含n个项目的容器:
我们选择第3个元素并对前2个进行二元搜索,将其置于正确的位置。容器中的前3个项目已经过排序。
我们选择第4个元素,并在前3个元素上进行二元搜索并将其放在正确的位置。现在排序前4个项目。
我们选择第5个元素并对前4个项目进行二元搜索并将其放在正确的位置。现在排序了5个项目。
。 。
我们选择第n个元素并对其他n-1个元素进行二元搜索,将其置于正确的位置。所有项目都已排序。
二进制搜索需要kk元素的logk,让我们说插入需要恒定的时间。不应该这样:
log2将第3个元素放在正确的位置。 log3将第4个元素放在正确的位置。 log4将第5个元素放在正确的位置。 。 。 。 log(n-1)将第n个元素放在正确的位置。
log2 + log3 + log4 + ... log(n-1)= log((n-1)!)?
我可能在胡说八道,但这看起来很有趣。
编辑:
我没有考虑插入时间。如果排序是在排序数组中完成的,并且元素之间存在间隙,该怎么办?这将允许快速插入而无需移动许多元素。经过多次插入后,我们可以重新分配元素。考虑到数组没有排序(我们可以使用shuffle来确保这一点)我认为结果可能非常快。
答案 0 :(得分:3)
听起来像insertion sort修改为使用二进制搜索。它是众所周知的,但并不是特别好用(据我所知),可能是因为它不会影响O(n²)
最坏情况,但会使O(n)
最佳情况需要{{1相反,因为插入排序不常用于任何除了非常小的数组或已经排序或接近排序的数组。
问题是您无法真正插入O(n log n)
。随机访问插入到数组中需要O(1)
,这当然是插入排序的众所周知的O(n)
复杂性所假设的。
可以考虑像binary search tree这样的数据结构,其O(n²)
插入 - 它不是O(log n)
,但我们最终仍然使用O(1)
算法。
哦O(log (n!))
= O(n log n)
,万一你想知道这件事。
答案 1 :(得分:2)
Tree sort(通用二叉搜索树)和splaysort(splay tree)都使用二叉搜索树进行排序。将元素添加到平衡二叉搜索树等同于进行二进制搜索以查找添加元素的位置,然后执行一些树操作以保持树平衡。如果没有某种类型的树,这将成为其他人提到的插入排序。
在最坏的情况下,树可能变得高度不平衡,导致O(N ^ 2)用于树种。使用自平衡二进制搜索树至少平均产生O(N log N)。 Splay排序是adaptive sort,当输入已经接近排序时,它变得非常有效。
答案 2 :(得分:1)
我认为通过二分搜索,他的意思是在可搜索的索引上有一个插入位置,我们期望找到我们插入的项目。在这种情况下,它将被称为插入排序......无论哪种方式,它仍然是N * log(N)