印象

图1 使用合并排序为一列数字进行排序的过程

思想

归并排序是典型的分治算法,它不断地将某个数组分为两个部分,分别对左子数组与右子数组进行排序,然后将两个数组合并为新的有序数组。

分析

  • 稳定: 是
  • 时间复杂度:
    • 最优时间: O(nlog(n))
    • 最坏时间: O(nlog(n))
    • 平均时间: O(nlog(n))

实例代码

C#

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
// 以下兩個循環把 lst 分為左右兩個 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;
}

推荐

博客园 - 图解排序算法(四)之归并排序

参考

Wikipedia - Merge sort

最新文章

  1. xcode调整debug,release模式
  2. HTML中strong与b,em与i标签的区别
  3. 使用maven创建Archetype
  4. iOS开发零基础--Swift篇:逻辑分支
  5. PHPCMS列表页伪静态
  6. Hadoop学习1--解决启动过程中的问题
  7. 【开源项目5】测滑菜单MenuDrawer的使用以及解析
  8. amazon RequestReport
  9. 流式计算-Jstorm提交Topology过程(上)
  10. KMP该算法解释(最长公共子)
  11. js 向form表单中插入数据
  12. ubuntu18.04新体验
  13. STL 小白学习(8) set 二叉树
  14. 30天代码day1Data Types
  15. 嵌入式linux——汇编、C语言基础(一)
  16. 科技论文之Latex公式&amp;amp;符号
  17. media属性
  18. Winform 开发基础分层框架
  19. maven-插件-不同的开发环境指定
  20. SpeechLib 应用

热门文章

  1. VirtualBox-Debian7.2-share
  2. MySQL 使用pt-table-checksum 检查主从数据一致性 (实例转)
  3. linux find -regex 使用正则表达式
  4. laravel 多个where的连接使用
  5. 蓝桥杯 算法训练 ALGO-152 8-2求完数
  6. Oracle 内存结构
  7. vBulletin 5.x 版本通杀远程代码执行漏洞复现
  8. leetcode479
  9. JSP+Servlet 无数据库模拟登录过程
  10. 关于EF中实体和数据表以及查询语句映射的问题