常见排序算法总结(5)归并排序

一篇文章,带你搞懂 归并排序 (注:代码语言的选择不应该限制了我们对算法的理解)

文章附有动图!一看就懂!

温馨提示:代码在文章末尾


1、基本思想

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

是不是有点感觉了呢,不要急,接着往下看。

2、合并相邻有序子序列

再来看看阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

3、动图理解

4、代码实现

光看懂思路可不太行,我们得落实到敲代码上!

来看归并排序的代码实现如下:

#include<iostream>
using namespace std;
#define MAX 100010 void merge(int A[],int left,int mid,int right)//归并
{int k,i,j;int temp[MAX];k=0;//k指向数组temp i=left;//i指向局部数组左半部分 j=mid+1;//j指向局部数组右半部分 while(i<=mid && j<=right){//i和j往后移直到左右数组有一个遍历结束 if(A[i]<A[j]){//如果当前左半边数组的元素小于右半边数组的元素,则把A[i]的值赋值到新数组temp中,同时让i和k往后移动一次temp[k++]=A[i++];//从小到大排序          }else{//如果当前左半边数组的元素大于右半边数组的元素,则把A[j]的值赋值到新数组temp中,同时让j和k往后移动一次,temp[k++]=A[j++];}}while(i<=mid){//左半边数组元素还没有遍历完,则把其剩下的所有元素直接拷贝到数组temp中 temp[k++]=A[i++];} while(j<=right){//右半边数组元素还没有遍历完,则把其剩下的所有元素直接拷贝到数组temp中 temp[k++]=A[j++];}for(i=0;i<right-left+1;i++)//把已经排好序的数组temp中所有元素拷贝到数组A中去 A[left+i]=temp[i];
}
void mergeSort(int A[],int left,int right)//分割
{int mid;if(left<right){ //只要没有分割成一个元素就:  mid=left+(right-left)/2;//注意不能写成 mid=right+(left-right)/2;要用right-left mergeSort(A,left,mid);//继续分割左半边直到只剩一个元素 mergeSort(A,mid+1,right);// 继续分割右半边直到只剩一个元素merge(A,left,mid,right);//左右半边排好序的数组合并到一起,成为一个有序数组 }
}
int main()
{int a[MAX],n,i;cin>>n;for(i=0;i<n;i++)cin>>a[i];mergeSort(a,0,n-1);for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;return 0;
} 

C/C++排序算法(5)归并排序相关推荐

  1. 排序算法:归并排序、快速排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...

  2. 排序算法之--归并排序(好玩的一个算法o。o)快速入门

    排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...

  3. NOI提高级:排序算法之归并排序、快速排序

    图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...

  4. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  5. [Alg]排序算法之归并排序

    [Alg]排序算法之归并排序 作者:屎壳郎 miaosg01@163.com 日期:Aug 2021 版次:初版 简介: 归并排序是一类在任何情况下都能保证Nlg⁡(N)N\lg(N)Nlg(N)的排 ...

  6. 【排序算法】归并排序(C语言)

    [排序算法]-- 归并排序(C语言) 目录 一.归并排序的原理 二.两个有序数组排序和合并 1. 原地排序 2. 创建临时空间 二.递归实现 三.非递归实现 1. 实现思路 2. 数组边界问题 3. ...

  7. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  8. 【DS】排序算法之归并排序(Merge Sort)

    一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...

  9. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解

    排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...

  10. 排序算法-07归并排序(python实现)

    归并排序 概述 以归并操作为基础的排序算法,底层算法设计为分治法. 所谓分治法,就是讲问题分解为多个子问题递归求解,再将子问题答案合并. 算法实现 将待排序序列分解为两个,四个,,,n个子部分. 两两 ...

最新文章

  1. 如何选择合适的损失函数,请看......
  2. 前5月全国快递业务量累计完成396.5亿件 同比增50.1%
  3. opencv jpg作为png背景_基于OpenCV与tensorflow实现实时手势识别
  4. Python-列表的常用方法
  5. RadGrid Columns HeaderText
  6. STL---二分查找、去重、全排列
  7. 基于AT89C52单片机秒表设计
  8. mencoder 转换rmvb格式为avi格式
  9. 为什么python打不开_Python打不开.py文件
  10. 450米、90米、30米全国地形图DEM数据对比与分享
  11. 2100 年的世界会怎样?用遥感数据预测未来城市
  12. 消息队列的优点和缺点
  13. python:基于TCP协议接收数据并解析保存至redis内存库
  14. VS 点击页面自动定位到解决方案资源管理器目录位置
  15. JavaScript 的防抖与节流
  16. 使用 JDB 调试 Android 应用程序
  17. rtmp断线重连_rtsp转rtmp rtsp2rtmp 同时16路视频 rtmp推流器 支持ipc dvr nvr
  18. php股票t 0,股票T+0是什么意思?如何看懂股票T+0?
  19. 小蜜蜂(裴波那契的应用)
  20. ACP相比AWS哪个更具有优势

热门文章

  1. Silverlight 视频学习札记(一)
  2. 行程日志2010-03-16沙井一村(1)
  3. MySQL助手_java 8.0Mysql 助手类
  4. openlayers事件类型
  5. 交换ctrl和左caps_如何在Linux中交换Ctrl和Caps Lock键
  6. linux 容器_Linux容器的幕后花絮
  7. (18)Vue DevTools插件
  8. 监听器实栗 在线人数统计
  9. 浏览器推送 comet
  10. Bootstrap 两端对齐的导航