归并排序(Merge Sort)

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

 

归并排序(Merge Sort),基于分治法的排序,比较简单。

个人感觉其核心1是数组左右拆分之后类似队列的比较,核心2是利用for循环不断增加间隔数

类似两两合并之类的算法都可以参考

 

大致步骤:拆开为树结构遍历 -> 最下层为二叉树,不断向上合并 -> 左右比较,合并直到回到根

 

 

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

比较结果放入结果数组中

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

 

 

为了易于学习,代码直接使用了队列:

复制代码
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,
}
复制代码

 

posted @   HONT  阅读(350)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
回到顶部