归并排序 java 迭代_经典排序算法之归并排序(示例代码)
归并排序(英语: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 迭代_经典排序算法之归并排序(示例代码)相关推荐
- 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)
排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...
- python遍历数组冒泡排序_经典排序算法(冒泡排序,选择排序,插入排序,快速排序,堆排序)python实现...
最近在复习经典排序算法,自己用python也实现了一下,这里不会涉及到原理(因为网上方法已经很详细啦),就把函数贴上来,可以让大家自己试着运行下,再结合别处的原理也可以更好地理解它们的实现. 如果有错 ...
- java分治法求数列的最大子段和_Java十大经典排序算法动画解析和 代码实现
排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...
- dv算法java实现_各种排序算法的分析及java实现(二)
更多精彩,请点击上方蓝字关注我们! 上次跟大家分享了下各种排序算法的分析及java实现(一)的相关知识,今天跟大家分享各种排序算法的分析及java实现(二)的知识.昨天我们讲到了选择排序,今天我们继续 ...
- 归并排序java_Java经典排序算法之归并排序详解
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...
- c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...
以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...
- ++代码实现 感知机的原理_常见排序算法原理及JS代码实现
来源:SegmentFault 思否社区 作者:Warren 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的理解说明,或许让你的困惑能得以解决(代码或说明若有问题,欢迎留言.联系 ...
- 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)
冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...
- java火山_各种排序算法java实现
插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author ...
最新文章
- js如何同时打开多个信息窗口 高德地图_高德地图-展示多个信息窗口
- 新手神器!不用部署深度学习环境、上传数据集!(附代码视频教程)
- 通过微信公众号获取用户信息(java版)
- [攻防世界 pwn]——level2
- python创建excel_python创建Excel文件数据的方法
- java aspose 导出word_使用aspose.word 第三方的插件实现导出word
- 二叉树知识点最详细最全讲解
- CV 加持的工业检测,从算法选型到模型部署
- 完整html生日祝福代码_孩子生日发朋友圈祝福语(一)!
- CCF202006-4 1246【矩阵快速幂】(100分题解链接)
- python循环的基本思想是重复_python基础-循环
- 餐饮水单打印软件_介绍送货单打印软件模板样式之购物小票格式
- Qt编写Modbus从机程序
- [USACO 2008 MAR] 土地购买
- linux mysqldump 备份所有数据库,mysqldump导出所有数据库
- IOS引入百度统计热力图崩溃
- 碱性溶液中HER动力学分析
- B站UP主恰饭新思路:产品糅合进有意思的内容里
- Must call super constructor in derived class before accessing or returning from derived const
- Flutter事件分发
热门文章
- lldb 调试 linux下 .net Core 总结及开源扩展 yinuo
- ASP.NET Core 中间件Diagnostics使用
- 在Windows Server 2012 R2 Standard 部署 ASP.NET Core程序
- 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
- Nginx 基础 ( 二)
- java类sample是公共的_应在名samle.java的文件_Andoid NDK编程 1 - 注册native函数
- Android Studio目录结构分析
- 【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据
- DateTime.Now.Ticks.ToString()说明
- linux之进程间通信--使用信号