合并排序的伪代码如何工作?

时间:2014-04-15 17:58:18

标签: algorithm sorting

我有这个Pseudocode用于合并排序。但不清楚它是如何工作的。有人可以向我解释一下吗?

for i=1 ; i<size ; i=2i
   for j=0 ; j<size - i ; j= j+2i
     Merge(&A[j] , i , min(2i,size-j))

Merge()方法是:

Merge(A, end1, end2)
  i = 0; j = end1 ; k =0

while i<end1 and j<end2
  if(A[i] < A[j])
    temp[k] = A[i]
  else
     temp[k] = A[j]
     j = j+1, k=k+1

while i<end1
   temp[k] = A[i]
   i = i+1 , k=k+1

while j<end2
   temp[k] = A[j]
   j = j+1 , k=k+1

for(i=0 ; i<end2; i++)
    A[i] = temp[i]

来源: http://www.youtube.com/watch?v=GCae1WNvnZM&list=PL89B61F78B552C1AB&index=4

如果有人能给我更好的算法教程来源,那也很棒...... 提前致谢。 : - )

2 个答案:

答案 0 :(得分:1)

让我们从合并操作开始:它将两个连续存储的序列作为输入。该函数将两个序列中的所有元素复制到临时存储器,始终选择两者中最小的一个(当任一序列耗尽时,复制继续另一个序列)。然后将所有元素复制回原始存储。

如果您承认两个输入序列是按排序顺序提供的,则合并的结果是单个排序序列。

现在是主程序。它由两个嵌套循环组成。外部的一个监视序列的长度,从1开始,每次都加倍。内部循环一次采用两个序列,计算它们存储的位置,并将它们合并为一个。

这里有MergeSort的魔力:最初,所有元素都形成1个元素的序列,这些元素显然是有序的。在一次传递(内部循环)之后,您将获得2个元素的排序序列。然后是4 ......直到仍然存在单个排序序列。

|e|b|g|h|c|a|f|d|
|be|gh|ac|df|
|begh|acdf|
|abcdefgh|

答案 1 :(得分:0)

这个想法如下:

mergesort(array)可以定义为:

  • 我们手动对小数组进行排序(手动的确切含义各不相同 - 例如,我们可以通过比较和交换它来对2个元素的数组进行排序)
  • 如果数组不小,我们将它分成两半,分别对每个部分mergesort;
  • 当完成两半的分类时,我们将结果合并为线性时间(将所有元素放入数组中,更喜欢从小到大);

Merge sort维基页面可能有用。此外,如果您对算法感兴趣,请尝试阅读this book,这真的很棒。