我正在尝试修改合并排序算法。根据我的修改,看起来它可以减少从O(nlogn)到O(n)的最佳情况和麦芽汁时间复杂度。我仍在为平均时间复杂度工作。
我们知道合并排序算法是基于分而治之的方法。
最佳案例
输入 :1 2 3 4 5 6 7 8 9 10
根据合并排序逻辑,我们必须将给定输入分成两个半组。继续进行半个过程直到组大小达到长度1.
分割之后,如果已经对数字进行了排序,我们就会进行合并处理。我认为我们可以通过添加简单的一个条件来删除合并过程
条件 :检查第n个元素的左半部分是否小于第一个元素的右半部分。如果是,则它已经排序,无需比较两半。
例如:
L: 1 2 3 4 5 R: 6 7 8 9 10
if L[4] < R[0]:
#two half are already in sorted order
else
#run merge algorithm
麦汁案例
输入: 10 9 8 7 6 5 4 3 2 1
条件: 检查第1个元素的左半部分是否大于第n个元素的右半部分。如果是,则交换左组和右组
例如:
L: 6 7 8 9 10 R: 1 2 3 4 5
if L[0] > R[4]:
#two half are already in sorted order
# swap left and right group value as it is
else
#run merge algorithm
如果您有任何想法,请告诉我们。在此先感谢:)。
答案 0 :(得分:2)
最坏情况的复杂性实际上不是O( n ),它仍然是O( n log n )。如果使用数组类型结构,则交换左半部分和右半部分需要O( n )时间,因为您需要移动 n 元素。如果您尝试使用链表类型结构,则可以在O(1)中完成交换,但是找到中点需要O( n )。
无论哪种方式,递推公式仍为T( n )= 2 T( n / 2)+ O( n ),根据{{3}}解析为T( n )= O( n log n )。