合并merge_sort的代码 - 验证

时间:2011-10-24 17:40:28

标签: c++ sorting

我在cprogramming找到了merge_sort的这个例子。我正在分解算法,以便在快速排序另一个SO post的情况下理解算法。

编辑:

我已更新/修复了代码并将其发布为以下答案。这是一个有效的merge_sort。

1 个答案:

答案 0 :(得分:0)

此处发布的代码可以在可读性方面进行一些改进......在这里它们是。验证这是一个有效的merge_sort:

#include "c_arclib.cpp"
void merge_helper(int *input, int left, int right, int *scratch)
  {
  if(right == left + 1)
    {
    return;
    }
  else
    {
    int i = 0;
    int length = right - left;
    int midpoint_distance = length/2;
    int l = left, r = left + midpoint_distance;
    merge_helper(input, left, left + midpoint_distance, scratch);
    merge_helper(input, left + midpoint_distance, right, scratch);
    for(i = 0; i < length; i++)
      {
      if((l < (left + midpoint_distance)) && (r == right || input[l] > input[r]))
        {
        scratch[i] = input[l];
        l++;
        }
      else
        {
        scratch[i] = input[r];
        r++;
        }
      }
    for(i = left; i < right; i++)
      {
      input[i] = scratch[i - left];
      }
    }
  }
int merge_sort(int *input, int size)
  {
    int *scratch = (int *)malloc(size * sizeof(int));
    if(scratch != NULL)
    {
        merge_helper(input, 0, size, scratch);
        free(scratch);
        return 1;
    }
    else
    {
        return 0;
    }
  }

int main()
  {
  int size=1000;
  int* array = new int[size]();
  util::rand_to_array(array,size);
  util::print_array(array, size);
  merge_sort(array, size);
  cout << endl; util::print_array(array, size);
  return 0;
  }