归并排序

  • 归并排序(Mergesort)的思想依然是分治(Divide and conquer),不过是先将一个数列分成子序列分别排序,再将排好序的子序列合并成一个有序序列,此过程称之为“归并 (merge)”
  • 算法描述
    • 1.选取数列中的中间点为分界点,将n个元素分成两个分别含有n/2元素的子序列(如果n为奇数,则左边的元素比右边的元素多1)
    • 2.将两个子序列递归排序,直到整个序列被分成n个子序列
    • 3.从最底层开始逐步合并两个排好序的序列
  • 时间复杂度 :n log n

归并排序模板如下:

void merge_sort(int q[], int l, int r)  // q[]为排序数组,l为左边界,r为有边界
{if (l >= r) return;  // 如果数组中中只有0个或1个原则,不用排序int mid = l + r >> 1;  // 取区间的中间值merge_sort(q, l, mid), merge_sort(q, mid + 1, r);  // 递归排序左右子序列int k = 0, i = l, j = mid + 1;  // k表示tmp数组中的个数,i是左子序列地起点,j为右子序列起点while (i <= mid && j <= r)  // 左右子序列都非空if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];  // 把左右子序列中较小的数放到当前位置上else tmp[k ++ ] = q[j ++ ];while (i <= mid) tmp[k ++ ] = q[i ++ ];  // 将左右两个子序列没有遍历完的接到tmp数组上while (j <= r) tmp[k ++ ] = q[j ++ ];for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];  // 把存在tmp数组中的结果赋值给q数组
}

归并排序(MergeSort)相关推荐

  1. 基本排序算法之4——归并排序mergesort

    归并排序理论上时间复杂度只有O(NlogN),但是其中存在过多临时内存分配和copy操作而不适用于内存排序,却是外部排序的基本思路.下面是我的实现: #include<iostream> ...

  2. 数据结构--链表--单链表归并排序mergesort

    思路: 1.将链表的中点找到,对其切分成2条 2.继续步骤1,切成4条,8条...,直至每段链表只有1个元素 3.归并操作,对两两链表进行合并排序,并返回回并后的链表的头结点,依次向上递归回去 C++ ...

  3. 【排序】归并类排序—归并排序(逆序数问题)

    文章目录 前言 归并排序(merge sort) 逆序数 结语 微信公众号:bigsai 数据结构与算法专栏 前言 在排序中,我们可能大部分更熟悉冒泡排序.快排之类.对归并排序可能比较陌生.然而事实上 ...

  4. PHP实现归治算法,PHP排序算法系列之归并排序详解

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

  5. c++归并排序_合并排序法

    一.合并排序(Merge Sort) 就是将多个有序数据表合并成一个有序数据表.如果参与合并的只有两个 有序表,那么称为二路合并.对于一个原始的待排序序列,往往可以通过分割的方法来归结为多路合 并排序 ...

  6. 数据结构排序法之堆排序he归并排序

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的时间,主要由建立初始 ...

  7. 快速排序伪代码_归并排序之入门到quot;放弃quot;

    归并排序之入门到"放弃" 前面我们已经讲解过了冒泡排序.选择排序.插入排序. 希尔排序.本次我们将讲解归并排序,希望大家学习完之后,能够徒手快速手写一个归并排序的实现代码. 由来 ...

  8. 快速排序算法_经常用到的的排序(快速排序和归并排序)简单的计算机算法学习...

    1.快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1960年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的 ...

  9. 排序算法-归并排序详细图解

    归并排序: 采用了分治策略 就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并的核心思想 将两个有序的数组合并成一个大的有序的数组,通过递归把待排 ...

  10. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. IE7下元素的 'padding-top' 遇到 'clear' 特性在某些情况下复制到 'padding-bottom'
  2. 【公开课预告】百度语言与知识最新技术成果详解
  3. 一些没啥用的大数据组件以及理由(持续更新中)+2020的Gartner曲线
  4. Buck-Boost变换
  5. 程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...
  6. 网站logo放在服务器,自己建网站如何设计网站LOGO
  7. C++学习之路 | PTA乙级—— 1045 快速排序 (25 分)(精简)
  8. 2019年技术盘点云数据库篇(二):阿里云携手MongoDB率先上线4.2数据库 云上数据库已是大势所趋...
  9. PTA c语言 统计一行文本的单词个数
  10. linux安装软件方法汇总
  11. html跳动的小球,canvas绘制跳动的小球
  12. SERVER的蓝屏信息速查表--THREE
  13. ROS 5.12 上自动更新3322.org动态域名
  14. 秒懂 this(带你撸平this)
  15. HDU 5586 Sum
  16. c语言开方不是整数怎么表示,c语言中的开方本人自学c语言,想请问在c中类似开方,取绝对值这类的(也不知道应该算运算符还是函数什么的)都要怎么解决~麻...
  17. 用c写按键精灵脚本语言,按键精灵脚本代码大全 按键精灵命令使用方法
  18. vue常用之“定义全局变量constants”
  19. ssm毕设项目iGame游戏交易平台nzln3(java+VUE+Mybatis+Maven+Mysql+sprnig)
  20. 在Activity中获取另一个XML文件的控件

热门文章

  1. EasyUI项目之书籍管理(CRUD)
  2. 软考系统集成项目管理工程师重要知识点
  3. python文件复制_python文件的复制
  4. 使用QT调用FFMPEG库部署到Android设备、完成视频音频应用开发
  5. 欧姆龙CP-X显示 END重复 以及 条 0 -重叠条
  6. vivo4.0以上系统怎么样不用root激活XPOSED框架的教程
  7. 【Keras中文文档】Layer Convolutional网址
  8. Apizza-响应json数据上设置浮动注释
  9. 机器学习深度学习视频资料大汇总
  10. 全国计算机高新技术模块,全国计算机信息高新技术考试模块总表.doc