归并排序(Merge_Sort)
基本思想
建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法原理
归并操作指的是将两个已经排序的序列合并成一个序列的操作,归并操作步骤如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针到达序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
特点
数据结构:数组
稳定性:稳定
过程
排序过程 宏观过程
复杂度与辅助空间
最差时间复杂度:O(nlogn)
最优时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
所需辅助空间:O(n)
源程序
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{ int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{ if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 }
} bool MergeSort(int a[], int n)
{ int *p = new int[n]; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true;
}
归并排序(Merge_Sort)相关推荐
- 疯子的算法总结(六) 复杂排序算法 ① 归并排序 merge_sort()
归并排序采取了分治的思想,每次分别排左半边和右半边,不断递归调用自己,直到只有一个元素递归结束,开始回溯,调用merge函数,合并两个有序序列,再合并的时候每次给末尾追上一个最大int这样就不怕最后一 ...
- C++算法之归并排序
C++算法之归并排序 文章目录 C++算法之归并排序 一.归并排序思想 二.排序步骤 三.代码实现 四.复杂度分析 一.归并排序思想 回顾快速排序的基本思想:找出一个分界线,并以该分界线为界将数组分为 ...
- 归并排序算法详解及示例
归并排序 归并排序算法是在分治算法的基础上设计出来的一种排序算法,它可以可以对指定的序列完成升序,(由小到大),或降序(由大到小),时间复杂度为 O ( n l o g n ) O(nlogn) O( ...
- 排序算法的实现。用C语言编程实现冒泡排序、选择排序、插入排序、shell排序、快速排序、堆排序算法、归并排序。利用随机函数产生N个随机整数(10000以上)。
#include<stdio.h> #include <time.h> #include<stdlib.h> #define N 10000 double T, T ...
- 选择排序稳定吗_最常见的四种数据结构排序算法你不知道?年末怎么跳槽涨薪...
前言 在学习数据结构的时候必然接触过排序算法,而且在日常开发中相信排序算法用得也比较多.而排序算法众多,各个效率又不同,难以记住.小编今天会介绍一些常用排序算法的特点和实现,对比不同排序算法的效率. ...
- Python数据结构常见的八大排序算法(详细整理)
前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...
- JAVA:数组,排序,查找4
一.数组 1.一维数组 (1).数组的定义 数据类型 数组名[]=new 数据类型[大小] public class Demo1 {public static void main(String[] a ...
- 利用MPI实现并行排序算法PSRS
参考 MPI实现psrs MPI并行正则采样排序PSRS算法原理及实现 实验题目 利用MPI实现并行排序算法PSRS 实验环境 操作系统 编译器 硬件配置 Ubuntu 16.04 mpicc 双核 ...
- 基础算法(一)零基础学算法---总结大篇
基础算法(一) 纯干货!! 排序及二分算法 码了7天,手残党也能看懂!! 手残第一篇:第一章 基础算法(一) 提示:你的三连是作者输出下去的动力哦!!真的真的!!!(小声哔哔:赶紧收藏!!内容持续更新 ...
最新文章
- 创新类编辑推荐:Sequence iBPMS平台
- 解决Unsupported major.minor version 51.0错误
- python经典100例答案pdf-Python 入门 100 案例,PDF免费下载
- eBay测试老兵的修炼之道:如何从测试“小工”到测试“专家”?
- rs.Open SQL,Conn,adOpenStatic,adLockOptimistic
- python filter()和reduce()函数用法详解
- 结构体命名中的尾标ST是什么意思?(struct)
- Unity4.6.2发布 支持64位iOS
- cad填充图案乱理石_CAD图案填充应该这么操作!简单又高效!!!1分钟就能学会...
- 使用 Gatsby.js 搭建静态博客 2 实现分页
- 怎么认识自己--《思辩与立场:生活中无处不在的批判性思维工具》
- python读取lmdb文件_LMDB 的 Python 接口使用方法
- stm32的语音识别_基于STM32的嵌入式语音识别模块设计
- 软考软件设计师-软件工程基础知识
- 太阳直射点纬度计算公式_干货 | 初中地理经纬度难点梳理+习题练手!必考建议收藏~...
- 努力成为一个有本事,没脾气的程序员
- 如何充分利用云计算解决云备份?
- superset集成echarts
- The Staircases
- 折磨人的商业计划书 (ZT)
热门文章
- api接口加密_谈谈API接口开发中的安全性如何解决
- php中浮点型的精确度,PHP中的浮点精度和类型
- linux 空格函数,linux c语言的split函数和空格处理函数
- php5.6 交叉编译,Cross-compile - 龙芯开源社区
- python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
- sonarqube连mysql_.net持续集成sonarqube篇之sonarqube安装与基本配置
- 四十五、深入Java的网络编程(上篇)
- 记录处理搜狗新闻分类
- 计算机网络应用基础第一章试题,计算机网络应用基础第一章测试题
- docker多个容器一起打包_详解Docker 容器基础系统镜像打包