简单的合并排序无法正确递归数组

本文关键字:递归 数组 合并 排序 简单 | 更新日期: 2023-09-27 18:35:47

我正在尝试将此处找到的简单合并排序算法移植到 C# 作为学术练习。我相信我遵循了他们的代码,但递归条件是错误的。

我相信我正确地从树的左侧递归(?),但是当我到达后半部分时,它进入了一个无限循环。如何获取递归以继续处理数组?

当我进入后半部分时,输出是:

11, 1, 5 
11, 1, 3 
11, 1, 2 
11, 1, 1 
11, 4, 6
11, 4, 6 
11, 4, 6 
11, 4, 6

代码为:

var input = new[] {5, 10, 1, 7, 9, 15, 8, 11, 20, 2};
var result = MergeSort.Sort(input);
using System;
using System.Diagnostics;
namespace MergeSort {
    internal class MergeSort
    {    
        public static int[] Sort(int[] input, int left = 0, int? rightNullable = null)
        {
            var right = (rightNullable == null)
                ? input.Length - 1
                : Convert.ToInt32(rightNullable);
            if (left >= right) { return input; }
            decimal centerDcl = left + Convert.ToInt32(right)/2;
            var center = Convert.ToInt32(centerDcl);
            Console.WriteLine("{0}, {1}, {2}", input.Length + 1, left + 1, center + 1);
            Debug.WriteLine("{0}, {1}, {2}", input.Length + 1, left + 1, center + 1);
            Sort(input, left, center);
            Sort(input, center + 1, rightNullable);
            input = Merge(input, left, center + 1, right);
            return input;
        }

简单的合并排序无法正确递归数组

decimal centerDcl = left + Convert.ToInt32(right)/2;

这似乎不对。

它应该是:

decimal centerDcl = (left + Convert.ToInt32(right))/2;