我们如何改进合并排序算法?

时间:2016-04-19 07:28:02

标签: algorithm sorting merge time-complexity

我正在尝试修改合并排序算法。根据我的修改,看起来它可以减少从O(nlogn)到O(n)的最佳情况和麦芽汁时间复杂度。我仍在为平均时间复杂度工作。

我们知道合并排序算法是基于分而治之的方法。

最佳案例

输入 :1 2 3 4 5 6 7 8 9 10

  1. 根据合并排序逻辑,我们必须将给定输入分成两个半组。继续进行半个过程直到组大小达到长度1.

  2. 分割之后,如果已经对数字进行了排序,我们就会进行合并处理。我认为我们可以通过添加简单的一个条件来删除合并过程

  3. 条件 :检查第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. 根据合并排序逻辑,我们必须将给定输入分成两个半组。继续半程,直到组大小达到1。
    2. 它总是以排序顺序分成两半。在合并过程中,我们只是通过线性过程重新排序两个半元素。如果你看左右两侧的反向排序。你会发现左组比右组大。所以在这里我们只需要将左组交换到右组。
    3. 条件: 检查第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
      

      如果您有任何想法,请告诉我们。在此先感谢:)。

1 个答案:

答案 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 )。