归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为

(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序适用于数据量大,同时解决了快速排序的痛点,大量重复数据并且链式结构同样适用(链式结构需要自己修改上述代码),但是归并排序同样也有问题就是需要开辟额外空间。

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

递归法(Top-down)

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

设定两个指针,最初位置分别为两个已经排序序列的起始位置

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针到达序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

迭代法(Bottom-up)

原理如下(假设序列共有

个元素):

将序列每相邻两个数字进行归并操作,形成

个序列,排序后每个序列包含两/一个元素

若此时序列数不是1个则将上述序列再次归并,形成

个序列,每个序列包含四/三个元素

重复步骤2,直到所有元素排序完毕,即序列数为1

// 归并排序 递归法,

// 注意返回的才是排好序的数组,原数组没有变动

function _merge(left, right){

// 创建大小为left + right 大小的数组

let result = [];

while(left.length > 0 && right.length > 0){

if (left[0] < right[0]){

result.push(left.shift());

} else{

result.push(right.shift());

}

}

return result.concat(left, right);

}

function mergeSort(arr){

if (arr.length <= 1) return arr;

let mid = arr.length >> 1;

let left = arr.slice(0, mid);

let right = arr.slice(mid);

return _merge(mergeSort(left), mergeSort(right));

}

c语言实现

?```c

// 归并排序, 递归法

void sortMergeRecursive(int *arr, int * reg, int start, int end){

if (start >= end) return;

int len = end - start;

int mid = (len >> 1) + start;

int startLfet = start, endLeft = mid;

int startRight = mid + 1, endRight = end;

sortMergeRecursive(arr, reg, startLfet, endLeft);

sortMergeRecursive(arr, reg, startRight, endRight);

int k = start;

// 左右两个数组按照大小合并成一个

while (startLfet <= endLeft && startRight <= endRight){

reg[k++] = arr[startLfet] < arr[startRight] ? arr[startLfet++] : arr[startRight++];

}

// 把另一个数组剩余的元素全部拷贝到reg数组里

while (startLfet <= endLeft){

reg[k++] = arr[startLfet++];

}

while (startRight <= endRight){

reg[k++] = arr[startRight++];

}

// 更新arr

for (k = start; k <= end; k++){

arr[k] = reg[k];

}

}

// 归并排序 入口

void sortMerge(int *arr, const int len){

int reg[len];

sortMergeRecursive(arr, reg, 0, len-1);

}

?```!--more-->

归并排序 java 迭代_经典排序算法之归并排序(示例代码)相关推荐

  1. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

  2. python遍历数组冒泡排序_经典排序算法(冒泡排序,选择排序,插入排序,快速排序,堆排序)python实现...

    最近在复习经典排序算法,自己用python也实现了一下,这里不会涉及到原理(因为网上方法已经很详细啦),就把函数贴上来,可以让大家自己试着运行下,再结合别处的原理也可以更好地理解它们的实现. 如果有错 ...

  3. java分治法求数列的最大子段和_Java十大经典排序算法动画解析和 代码实现

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...

  4. dv算法java实现_各种排序算法的分析及java实现(二)

    更多精彩,请点击上方蓝字关注我们! 上次跟大家分享了下各种排序算法的分析及java实现(一)的相关知识,今天跟大家分享各种排序算法的分析及java实现(二)的知识.昨天我们讲到了选择排序,今天我们继续 ...

  5. 归并排序java_Java经典排序算法之归并排序详解

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...

  6. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  7. ++代码实现 感知机的原理_常见排序算法原理及JS代码实现

    来源:SegmentFault 思否社区 作者:Warren 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的理解说明,或许让你的困惑能得以解决(代码或说明若有问题,欢迎留言.联系 ...

  8. 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)

    冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...

  9. java火山_各种排序算法java实现

    插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author ...

最新文章

  1. js如何同时打开多个信息窗口 高德地图_高德地图-展示多个信息窗口
  2. 新手神器!不用部署深度学习环境、上传数据集!(附代码视频教程)
  3. 通过微信公众号获取用户信息(java版)
  4. [攻防世界 pwn]——level2
  5. python创建excel_python创建Excel文件数据的方法
  6. java aspose 导出word_使用aspose.word 第三方的插件实现导出word
  7. 二叉树知识点最详细最全讲解
  8. CV 加持的工业检测,从算法选型到模型部署
  9. 完整html生日祝福代码_孩子生日发朋友圈祝福语(一)!
  10. CCF202006-4 1246【矩阵快速幂】(100分题解链接)
  11. python循环的基本思想是重复_python基础-循环
  12. 餐饮水单打印软件_介绍送货单打印软件模板样式之购物小票格式
  13. Qt编写Modbus从机程序
  14. [USACO 2008 MAR] 土地购买
  15. linux mysqldump 备份所有数据库,mysqldump导出所有数据库
  16. IOS引入百度统计热力图崩溃
  17. 碱性溶液中HER动力学分析
  18. B站UP主恰饭新思路:产品糅合进有意思的内容里
  19. Must call super constructor in derived class before accessing or returning from derived const
  20. Flutter事件分发

热门文章

  1. lldb 调试 linux下 .net Core 总结及开源扩展 yinuo
  2. ASP.NET Core 中间件Diagnostics使用
  3. 在Windows Server 2012 R2 Standard 部署 ASP.NET Core程序
  4. 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
  5. Nginx 基础 ( 二)
  6. java类sample是公共的_应在名samle.java的文件_Andoid NDK编程 1 - 注册native函数
  7. Android Studio目录结构分析
  8. 【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据
  9. DateTime.Now.Ticks.ToString()说明
  10. linux之进程间通信--使用信号