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开发
|
9月前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
708 13
|
7月前
|
人工智能 运维 安全
科技云报到:多行业拥抱DeepSeek,全不顾它身上的“刺”
科技云报到:多行业拥抱DeepSeek,全不顾它身上的“刺”
|
数据采集 存储 JavaScript
构建你的首个Python网络爬虫:抓取、解析与存储数据
【8月更文挑战第31天】在数字时代的浪潮中,数据成为了新的石油。了解如何从互联网的海洋中提取有价值的信息,是每个技术爱好者的必备技能。本文将引导你通过Python编程语言,利用其强大的库支持,一步步构建出你自己的网络爬虫。我们将探索网页请求、内容解析和数据存储等关键环节,并附上代码示例,让你轻松入门网络数据采集的世界。
|
10月前
|
数据采集 存储 分布式计算
ClickHouse大规模数据导入优化:批处理与并行处理
【10月更文挑战第27天】在数据驱动的时代,高效的数据导入和处理能力是企业竞争力的重要组成部分。作为一位数据工程师,我在实际工作中经常遇到需要将大量数据导入ClickHouse的需求。ClickHouse是一款高性能的列式数据库系统,非常适合进行大规模数据的分析和查询。然而,如何优化ClickHouse的数据导入过程,提高导入的效率和速度,是我们面临的一个重要挑战。本文将从我个人的角度出发,详细介绍如何通过批处理、并行处理和数据预处理等技术优化ClickHouse的数据导入过程。
933 0
|
域名解析 网络协议 安全
【域名解析DNS专栏】DNS递归查询与迭代查询的区别及影响
【5月更文挑战第24天】DNS的递归查询与迭代查询是域名解析的两种方式。递归查询由客户端发起,DNS服务器负责全程解析,速度快但可能增加服务器负载和安全风险。迭代查询则需客户端参与多次查询,虽慢但分散负载,提高安全性。理解两者差异有助于优化网站访问体验和安全性。
2147 0
【域名解析DNS专栏】DNS递归查询与迭代查询的区别及影响
【qt】纯代码界面设计
【qt】纯代码界面设计
439 2
|
缓存 Java Maven
深入解析Google Guava库与Spring Retry重试框架
深入解析Google Guava库与Spring Retry重试框架
|
数据可视化 数据挖掘 Python
Python用 tslearn 进行时间序列聚类可视化
Python用 tslearn 进行时间序列聚类可视化
|
存储 安全 网络安全
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
群晖部署容器魔方并结合内网穿透实现远程访问本地服务
412 0

热门文章

最新文章