归并排序(Merge Sort)
时间:2019-03-18
本文章向大家介绍归并排序(Merge Sort),主要包括归并排序(Merge Sort)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先,归并排序中的“归并”是什么意思?
按照对应的英文merge,其实就是“合并”,“融合”。
那么,排序又为什么要融合、合并,怎么去融合、合并?
若有两个已经升序的数组,将这两个子数组合并成一个升序数组的时间复杂度是多少?
只需要两个指针分别指向两个数组的首元素,比较它们的大小,选择其中较小的数按序放进合并数组,对应指针后移,最后将一个子数组剩下的元素都放进合并数组,可见,将两个有序数组合并成一个有序数组的时间复杂度为O(n)。
对于一个无序的数组来说,它有n个元素,每个元素可以看成一个有序数组,将这些“有序数组”两两合并,那么每次有序数组的个数减少一半,也即要进行logn层合并操作,一层合并是O(n),最后整个归并排序的时间复杂度为O(nlogn)。
每次相邻有序数组的合并操作就是一次排序。
另外涉及到合并数组的问题,由于要进行多次合并操作,所以将这里的合并数组作为辅助数组,每次合并之后覆盖掉原来待排序数组,保证子数组总是有序的。只需要一个辅助数组即可。
void merge_sort_recursive(int arr[], int tmp[], int start, int end){
if(start >= end )
return;
mid = start + (end - start >>1);
merge_sort_recursive(arr, tmp, start, mid);//左边有序
merge_sort_recursive(arr, tmp, mid+1, end);//右边有序
int i = start, j = mid + 1;//子数组的首元素
int k = 0;
while(i<=mid && j<=end){
tmp[k++] = arr[i] < arr[j] ? arr[i++]:arr[j++];
}
while(i <= mid)
tmp[k++] = arr[i++];
while(j <= end)
tmp[k++] = arr[j++];
for(i = 0; i<k; ++i)
arr[start + i] = tmp[i];
}
int merge_sort(int arr[], int length){
if(arr = NULL || length < 1)
return -1;
int* tmp = new int(length);
if(tmp == NULL)
return -1;
merge_sort_recursive(arr, tmp, 0, length-1);
delete[] tmp;
return 0;
}
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- 通过addm分析io问题(r2笔记64天)
- python爬虫+R数据可视化 实例
- 梯度下降优化算法综述
- 关于oracle后台启用的schedule job(r2笔记65天)
- 数据结构和算法——二叉树
- 【专业技术】谷歌浏览器实现Javascript扩展
- 数据结构和算法——二叉排序树
- 通过shell脚本生成查询表数据的sql (r2笔记63天)
- Linux C 编程——多线程
- 数据结构和算法——Huffman树和Huffman编码
- 简单易学的机器学习算法——K-Means++算法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode76|两颗二叉搜索树中的所有元素
- LeetCode75|二叉搜索树的第k大节点
- LeetCode86|只出现一次的数字II
- LeetCode85|只出现一次的数字III
- LeetCode84|只出现一次的数字
- LeetCode83|排序矩阵查找
- LeetCode82|翻转字符串里的单词
- LeetCode81|移动零
- LeetCode80|反转字符串中的元音字母
- LeetCode79|平方数之和
- LeetCode91|寻找重复数
- LeetCode90|两个数组的交集
- LeetCode89|在排序数组中查找数字I
- LeetCode88|两数之和IV-输入BST
- LeetCode98|判定字符是否唯一