Java--十大排序算法之归并排序
前言
本系列排序包括十大经典排序算法。
- 使用的语言为:Java
- 结构为: 定义抽象类
Sort
里面实现了,交换,大小比较等方法。例如交换两个值,直接传入下标就可以了。其他的具体排序的类都继承抽象类Sort
。这样我们就能专注于算法本身。
/** 返回值等于0,代表 array[i1] == array[i2]* 返回值小于0,代表 array[i1] < array[i2]* 返回值大于0,代表 array[i1] > array[i2]*/protected int cmp(int i1, int i2) {return array[i1].compareTo(array[i2]);}protected int cmp(T v1, T v2) {return v1.compareTo(v2);}protected void swap(int i1, int i2) {T tmp = array[i1];array[i1] = array[i2];array[i2] = tmp;}
复制代码
什么是归并排序
- 归并排序(mergesort)是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
概述
采用分治法:
- 分割:递归地把当前序列平均分割成两半。
- 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。
归并操作
- 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
递归法(Top-down)
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
迭代法(Bottom-up)
原理如下(假设序列共有n个元素):
- 将序列每相邻两个数字进行归并操作,形成ceil(n/2)个序列,排序后每个序列包含两/一个元素
- 若此时序列数不是1个则将上述序列再次归并,形成ceil(n/4)个序列,每个序列包含四/三个元素
- 重复步骤2,直到所有元素排序完毕,即序列数为1
时空复杂度
- 最好时间复杂度:O(nlogn)
- 最坏、平均时间复杂度:O(nlogn)
- 空间复杂度:O(n)
算法稳定性
- 归并排序是一种稳定排序算法。
是否是原地算法
- 何为原地算法?
- 不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入
- 空间复杂度为
Java--十大排序算法之归并排序相关推荐
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- JAVA十大排序算法动画_十大排序算法(java实现)
[前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...
- 十大排序算法之归并排序
归并排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想1(正着想):将一个大的无序数组有序,我们可以把大的数组等分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序 ...
- Java十大排序算法总结,Java排序算法总结之冒泡排序
本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起 ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
- 十大排序算法(Java)
文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...
- 归并排序执行次数_十大排序算法,看这篇就够了
排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...
- 这或许是东半球分析十大排序算法最好的一篇文章
作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...
- 「干货总结」程序员必知必会的十大排序算法
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...
- 「归纳|总结」程序员必知必会的十大排序算法
微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...
最新文章
- 两台ubuntu虚拟机环境下hadoop安装配置
- Python学习之旅 —— 基础篇(二)数据类型、运算、while循环
- Redis 学习资料整理
- redis windows
- ubuntu12.04上安装flashcahce
- Jmeter创建一个点对点的 JMS 测试计划
- 多线程之 CreateThread与_beginthreadex本质区别
- 电脑下面的任务栏怎么取消隐藏_电脑桌面右下方任务栏的小图标如何隐藏
- Zookeeper01_必看
- 海康威视主机升级固件_海康威视网络广播主机DSKAM6HG1S
- 全国计算机等级考试题库二级C操作题100套(第27套)
- oracle v$context,30.Oracle杂记——Oracle常用动态视图v$session
- Java中关于二叉树详解
- 高通Snapdragon Sensor Core(SSC)笔记
- 面向对象:结构化开发方法和面向对象开发方法
- matlab 交互界面设计
- Variation calling and annotation
- 【Linux】进程管理之kill、killall、pkill
- 安恒2018.10 level1思路讲解
- 浅淡计算机网络的应用,【计算机专业论文】浅谈计算机网络技术人工智能的应用(共3693字)...
热门文章
- 数据结构与算法:十大排序算法之归并排序