排序算法研究之归并排序(Merge sort)
前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序 , 希尔排序, 堆排序本节,我们介绍基于归并操作的归并排序。
1、算法思想
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,归并排序将两个已经有序的序列合并成一个有序的序列。
2、算法流程
主要两步(分,合)
步骤1进行序列拆分,这是一递归的操作,通常是分到只剩一个元素。(一个元素必定是有序的)
步骤2对排好序的序列合并。
思路:假设我们有一个没有排好序的序列,那么我们首先使用分割的方法将这个序列分割成一个个已经排好序的子序列(直到剩下一个元素)。然后再利用归并的方法将一个个有序的子序列合并成排好序的序列。
具体流程可见下图,截取自博主 zpznba 感谢分享!!
3、算法优缺点
优点:
高效,稳定,和选择排序一样不受输入数据影响,但是要比选择排序好的多最坏时间复杂度 = 平均时间复杂度 O(nlogn)
缺点:
需要辅助空间来构建临时数组。
4、主要代码c++
例子:输入一个有10个元素的数组,并对其进行归并排序,最后数组为升序
/**************************************************************************** @file Merge_sort.cpp* @author Shawn* @date 26 March 2019* @remark 26 March 2019* @theme Merge Sort***************************************************************************/
# include<iostream>
using namespace std;void Merge(int [], int, int, int, int []);
// 归并排序划分过程
void MergeSort(int a[], int left, int right, int temp[])
{if(left < right){int mid = (left + right) >> 1;MergeSort(a,left,mid,temp);MergeSort(a,mid+1,right,temp);Merge(a,left,mid,right,temp);}
}// 归并排序合并过程
// 将数组下标范围[left,mid]和[mid+1,right]的有序序列合并成一个有序序列
void Merge(int a[], int left, int mid, int right, int temp[])
{int p0 = 0;int p1 = left, p2 = mid + 1;// p0指向辅助数组的首位// p1指向数组[left,mid]的首位,p2指向数组[mid+1,right]的首位// 开始排序,< 先放小元素升序,>降序while(p1<=mid && p2<=right){if(a[p1] < a[p2])temp[p0++] = a[p1++];elsetemp[p0++] = a[p2++];}如果还有剩余元素,直接放入到辅助数组中while(p1<=mid)temp[p0++] = a[p1++];while(p2<=right)temp[p0++] = a[p2++];// 拷贝temp排好顺序的元素到数组a中,// 注意数组a是从left开始的,不能默认为0,并且一共有元素right-left+1个元素。for(int i=0; i<right-left+1;++i)a[left+i] = temp[i];
}
int main()
{int array [] = {55,2,6,4,32,12,9,73,26,37};int len = sizeof(array) / sizeof(int);cout<<"输入的原始序列: ";for(int i=0; i<len; i++) // 输出原序列cout<<array[i]<<",";cout<<endl<<endl;cout<<" ----堆排序结果---- " << endl;int *temp = new int [len];MergeSort(array,0,len-1,temp); // 调用排序函数for(int j=0; j<len; j++)cout<<array[j]<<",";return 0;
}
排序算法研究之归并排序(Merge sort)相关推荐
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...
- python选择排序算法图解_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- python 归并排序算法_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- 归并python_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- 经典排序算法(五) —— Merge Sort 归并排序
文章目录 简介 排序过程 实现 版本一 版本二 复杂度 简介 约翰·冯·诺伊曼在 1945 年提出了归并排序.归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and ...
- python实现基本算法之归并排序(Merge sort)
基本算法之归并排序(Merge sort) 基本算法-04.归并排序(Merge sort)算法 .往期请看选择排序,插入排序,归并排序,快速排序等等都发布的!欢迎大家批评指正! 文章目录 基本算法之 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...
- 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...
- C语言以递归实现归并排序Merge Sort算法(附完整源码)
以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...
最新文章
- 用计算机打出圣诞树,手机计算器圣诞树的祝福输入方式,手机计算器圣诞树获得方法...
- [BZOJ 3894]文理分科(最小割)
- TWRP-recovery中文界面安装方法[转]
- mini2440-Openwrt启动信息
- ubuntu的mysql教程 pdf_Ubuntu上的MySQL字符集设置技巧
- Elasticsearch——filter过滤查询
- Android聊天机器人
- java编译容器_Java基础:容器
- mysql decimal_MySQL系列之数据类型及约束
- 疯狂Java讲义(读书笔记)(第六章--Java基础类库)
- 利用MATLAB实现人脸识别GUI程序设计
- iPhone/iPad/Android UI尺寸规范 手机尺寸
- 自动生成banner网站
- 对于多人联机游戏中 游戏房间实现的想法
- 微信小程序隐藏分享按钮
- 计算机为什么有个来宾用户名,电脑里面突然多出来一个叫Guest的账户是怎么回事?...
- 谷歌浏览器如何安装插件
- 从管好事提升管理水平--创建事
- 超全面,带你了解UI设计全流程!
- 数据库完整性之参照完整性