归并排序(Merge Sort)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序(Merge Sort)相关的知识,希望对你有一定的参考价值。

更详细的请看这篇博文:http://www.cnblogs.com/jingmoxukong/p/4308823.html

我只做个人学习和补充

 

基于分治法的排序,比较简单。个人感觉其核心是数组左右拆分之后类似队列的比较。类似两两合并之类的算法都可以参考

 

分为3个步骤,拆开为树结构遍历->向上合并

特别做了一张gif来更好的理解归并排序

 

左边集合比较通过就左边索引前进,右边集合比较通过则右边索引前进

比较结果放入结果数组中

最后如果多出一个就把这一个直接加入结果数组

技术分享

 

 

为了易于学习,代码直接使用了队列。只具有参考意义:

技术分享
public class MergeSort
{
    public class Node
    {
        public int Num;
        public Node Left;
        public Node Right;


        public void Init(int[] source)
        {
            var midInx = (int)Math.Floor(source.Length / (double)2);

            if (source.Length > 1)
            {
                Left = new Node();
                Left.Init(source.Take(midInx).ToArray());

                Right = new Node();
                Right.Init(source.Skip(midInx).ToArray());
            }
            else
            {
                Num = source[0];
            }
        }

        public int[] Merge()
        {
            if (Left == null && Right == null)
            {
                return new int[] { Num };
            }
            else
            {
                var leftResult = Left.Merge();
                var rightResult = Right.Merge();

                return Merge(leftResult, rightResult);
            }
        }

        int[] Merge(int[] leftArr, int[] rightArr)
        {
            var result = new List<int>();
            var leftQueue = new Queue<int>(leftArr);
            var rightQueue = new Queue<int>(rightArr);

            while (leftQueue.Count > 0 && rightQueue.Count > 0)
            {
                var minValue = 0;
                if (leftQueue.Peek() <= rightQueue.Peek())
                    minValue = leftQueue.Dequeue();
                else
                    minValue = rightQueue.Dequeue();

                result.Add(minValue);
            }

            result.AddRange(leftQueue);
            result.AddRange(rightQueue);

            return result.ToArray();
        }
    }

    public int[] Execute(int[] sourceArr)
    {
        var root = new Node();

        root.Init(sourceArr);

        return root.Merge();
    }
}
MergeSort

 

使用:

static void Main(string[] args)
{
    var mergeSort = new MergeSort();

    var result = mergeSort.Execute(new int[] { 12, 4, 6, 3, 20, 7, 4 });

    for (int i = 0; i < result.Length; i++)
    {
        Console.Write(result[i] + ",");
    }

    Console.Read();
    //print: 3,4,4,6,7,12,20,
}

 

以上是关于归并排序(Merge Sort)的主要内容,如果未能解决你的问题,请参考以下文章

自底向上归并排序(Merge Sort)

排序算法之归并排序(Merge Sort)

归并排序(Merge Sort)思想,代码实现

归并排序(Merge sort)

归并排序(merge_sort)

排序算法--Merge Sorting--归并排序--Merge sort--归并排序