【问题标题】:Consolidating code for merge_sort - Validation合并 merge_sort 的代码 - 验证
【发布时间】:2011-10-30 07:46:30
【问题描述】:

我在cprogramming 找到了这个合并排序示例。我很想分解算法以在快速排序另一个SO post 的上下文中理解算法。

编辑:

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

【问题讨论】:

    标签: c++ sorting


    【解决方案1】:

    此处发布的代码可能会在可读性方面进行一些改进...在这里。已验证这是一个有效的合并排序:

    #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;
      }
    

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多