C#——归并排序

简介: C#——归并排序

归并排序算法(Merge Sort)是一种采用分治法(Divide-And-Conquer)的排序算法。分治策略将原问题划分为n个规模较小而结构与原问题相似的子问题,递归地解决这些子问题,然后在合并其结果,就得到原问题的解。分治模式在每一层递归上都包含三个步骤:分解、解决、合并。即归并=递归+合并。

数组分左右,左右元素相比较,满足条件放入新数组,一侧用完放对面。 递归不停分,分完再排序,排序结束往上走,边走边合并,走到头顶出结果。

递归平分数组就是不停进行分割,当长度小于2停止,然后开始比较,一层一层向上比。 而基本排序规则,左右元素进行比较,依次放入新数组中。当—侧没有的时候,另一侧直接放入新数组。

算法步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
  4. 重复步骤 3 直到某一指针达到序列尾;
  5. 将另一序列剩下的所有元素直接复制到合并序列尾。

代码如下:

public static List<int> sort(List<int> lst) {  
    if (lst.Count <= 1)  
        return lst;  
    int mid = lst.Count / 2;  
    List<int> left = new List<int>();  // 定义左侧List  
    List<int> right = new List<int>(); // 定义右侧List  
    // 以下两个循环把 list 分为左右两个 List  
    for (int i = 0; i < mid; i++)  
        left.Add(lst[i]);  
    for (int j = mid; j < lst.Count; j++)  
        right.Add(lst[j]);  
    left = sort(left);  
    right = sort(right);  
    return merge(left, right);  
}  
/// <summary>  
/// 合并两个已经排好序的List  
/// </summary>  
/// <param name="left">左側List</param>  
/// <param name="right">右側List</param>  
/// <returns></returns>  
static List<int> merge(List<int> left, List<int> right) {  
    List<int> temp = new List<int>();  
    while (left.Count > 0 && right.Count > 0) {  
        if (left[0] <= right[0]) {  
            temp.Add(left[0]);  
            left.RemoveAt(0);  
        } else {  
            temp.Add(right[0]);  
            right.RemoveAt(0);  
        }  
    }  
    if (left.Count > 0) {  
        for (int i = 0; i < left.Count; i++)  
            temp.Add(left[i]);  
    }  
    if (right.Count > 0) {  
        for (int i = 0; i < right.Count; i++)  
            temp.Add(right[i]);  
    }  
    return temp;  
}


目录
相关文章
|
人工智能 语音技术 Android开发
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
1371 13
|
算法
KMP算法
KMP算法
226 0
|
域名解析 网络协议 安全
【域名解析DNS专栏】DNS递归查询与迭代查询的区别及影响
【5月更文挑战第24天】DNS的递归查询与迭代查询是域名解析的两种方式。递归查询由客户端发起,DNS服务器负责全程解析,速度快但可能增加服务器负载和安全风险。迭代查询则需客户端参与多次查询,虽慢但分散负载,提高安全性。理解两者差异有助于优化网站访问体验和安全性。
3192 0
【域名解析DNS专栏】DNS递归查询与迭代查询的区别及影响
【qt】纯代码界面设计
【qt】纯代码界面设计
544 2
|
数据采集 存储 分布式计算
ClickHouse大规模数据导入优化:批处理与并行处理
【10月更文挑战第27天】在数据驱动的时代,高效的数据导入和处理能力是企业竞争力的重要组成部分。作为一位数据工程师,我在实际工作中经常遇到需要将大量数据导入ClickHouse的需求。ClickHouse是一款高性能的列式数据库系统,非常适合进行大规模数据的分析和查询。然而,如何优化ClickHouse的数据导入过程,提高导入的效率和速度,是我们面临的一个重要挑战。本文将从我个人的角度出发,详细介绍如何通过批处理、并行处理和数据预处理等技术优化ClickHouse的数据导入过程。
1569 0
|
存储 关系型数据库 分布式数据库
6倍性能差100TB容量,阿里云POLARDB如何实现?
本文讲的是6倍性能差100TB容量,阿里云POLARDB如何实现,POLARDB是阿里云数据库团队研发的基于第三代云计算架构下的商用关系型云数据库产品,实现100%向下兼容MySQL 5.6的同时,支持单库容量扩展至上百TB以及计算引擎能力及存储能力的秒级扩展能力,对比MySQL有6倍性能提升及相对于商业数据库实现大幅度降低成本。
15654 0
|
缓存 Java Maven
深入解析Google Guava库与Spring Retry重试框架
深入解析Google Guava库与Spring Retry重试框架
|
数据可视化 数据挖掘 Python
Python用 tslearn 进行时间序列聚类可视化
Python用 tslearn 进行时间序列聚类可视化
|
存储 安全 网络安全
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
579 0

热门文章

最新文章