【问题标题】:Merge Process In-Place:就地合并流程:
【发布时间】:2020-01-28 22:26:50
【问题描述】:

MergeSort 中的合并过程无法就地运行。 这是我的解释:

它加起来了吗?

A = 5,1,9,2,10,0

“q”:指向索引 2 处数组中间的指针。

我们正在将 q 及其左侧的元素与 q 右侧的元素合并。

A= 1,5,10,0,2,12

我们用“i”指向左边的开始,用“j”指向右边的开始。

我们用“k”指向数组中的当前位置。

算法从 i=0、j=3、k=0 开始。

如果我们就地合并:for k=0:i= 0, j= 3,0 A[k] =A[j] andj++

结果数组:A={0,5,10,0,2,12}

如我们所见,我们已经失去了值 1。

我们将继续丢失值,例如在下一次迭代中:

对于 k=1:i= 0, j= 4,0

结果数组:A={0,0,10,0,2,12}

【问题讨论】:

    标签: arrays sorting merge mergesort in-place


    【解决方案1】:

    可以使用子数组的旋转来完成。存在时间复杂度为 O(n log(n)) 的合并排序,但它们使用数组的一部分作为工作存储。如果需要稳定性,则使用一些唯一值的小子集(如 2 sqrt(n))来提供空间,因为在排序之前重新排序唯一值不会破坏稳定性。回到简单的旋转算法:

     1  5 10  0  2 12
     0  1  5 10  2 12         0 <  1, rotate  0 into place, adjust working indexes
     0  1  5 10  2 12         1 <  2, continue
     0  1  2  5 10 12         2 <  5, rotate  2 into place, adjust working indexes
     0  1  2  5 10 12         5 < 12, continue
     0  1  2  5 10 12        10 < 12, continue, end of left run, done
    

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 2011-04-01
      • 1970-01-01
      • 2011-03-18
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多