MergeSort中的两个递归调用是什么?

时间:2015-01-02 18:02:54

标签: performance algorithm mergesort

学习算法并且难以理解MergeSort中两个递归调用的具体构成。感谢帮助。感谢。

2 个答案:

答案 0 :(得分:1)

让数组的大小 N 。基本上采用数组并分为两部分,从1到 N / 2 N / 2 + 1 N 。我们分别将这些部分称为 L R 。现在,如果我们可以排序 L R 分别我们可以合并它们以获得最终结果。现在,您如何排序 L R ,再次应用相同的程序。因此有两个递归部分,一个递归排序 L 然后两个递归排序 R ,然后合并它们。伪代码

      merge_sort ( 1 , N )
         merge_sort(1,N/2) /* L */
         merger_sort(N/2 + 1,N) /* R */
         merge both these sorted parts 

答案 1 :(得分:1)

只用一个功能就可以实现同样的功能。 这是伪代码:

def mergesort(int l, int r) {

  if l == r:
    return

  int mid = (l + r) / 2
  mergesort(l, mid)
  mergesort(mid + 1, r)

  merge left subarray and right subarray
}

这是C ++代码:

#include <cstdio>
#include <cstdlib>

using namespace std;
const int N = 1000003;

int tmp[N];
int a[N];

void merge_sort(int b, int e) {

  if(b == e) // if there is only one element, then we have an sorted subarray
    return;

  int mid = (b + e) / 2;
  merge_sort(b, mid); //recursive call
  merge_sort(mid + 1, e); //recursive call

  int sz = e - b + 1; // the size of the subarray

  for(int k = 0, i = b, j = mid + 1; k < sz; ++k) {

    if(i > mid) //if we have passed the border of left subarray, use the right one
      tmp[k] = a[j++];
    else if(j > e) // if we have passed the border of right subarray, use the left one
      tmp[k] = a[i++];
    else { // if all borders are oke
      if(a[i] > a[j]) // compare values in left and right subarray
        tmp[k] = a[j++];
      else
        tmp[k] = a[i++];
    }
  }  

  // sorted values form b to e are in tmp array, now just copy the tmp array to array a
  for(int i = 0, j = b; i < sz; ++i, ++j)
    a[j] = tmp[i]; 

}

int main() {

  int n; scanf("%d", &n);
  for(int i = 0; i < n; ++i)
    scanf("%d", &a[i]);

  merge_sort(0, n - 1);

  for(int i = 0; i < n; ++i)
    printf("%d ", a[i]);

  return 0;
}