归并排和快排的时间复杂度都是o(nlogn).属于比较高效的一种排序算法。归并排序使用的分治思想。所谓的分治:分---就是将原数组划分派别,直到划到不可分为止;

治:将各个派别两两’治理‘,合成一个有序派别。需要强调的是这里的‘治’是指原先两个本就有序的派别重新比较治理。这里涉及的两个动作第一就是递归地划分,比较容易实现;另一个就是对两个有序的子数组进行比较合并,比较时我们可能需要一个临时存储区---一个先进先出的队列。当然你也可以申请一个与原始数组等长的临时数组。比较过程如下:从两个子数组开始处比较,谁小就把谁放入临时存储区,并取下一个值继续比较。如果一方比较完毕,则把另一方全部放入临时存储区中。最后再把临时存储区里的数组(已经全部有序)赋值回原始数组。临时比较图示说明如下:原始数组

0 1 2 3 4 5 6 7 8 9 10
2 4 6 8 1 4 0 2 7 4 10

注:第一行为下标,第二行为元素。目标从小到大排序。这里为了说明比较过程,我选取一个中间比较过程比如当我们把这些元素递归成单一派别,再合并时可能会出现下标为0-2的元素有序,下标为3-5的元素有序即是下面这种情况。

0 1 2 3 4 5 6 7 8 9 10
2 4 6 1 4 8 0 2 7 4 10

下面的合并就是将二者合并成整体有序。先将元素2和元素1比较,将较小元素1优先存入临时队列,同时将元素1的下标后移,开始下一次比较元素2和4比较;依次类推。如果哪一个元素移动到头。就把另一子数组中全部元素移入临时队列。合并后的临时队列为。注意:我这里强调凡是排好序的都是放在了临时队列中,原数组没做变动。这也是为什么最后我们要把临时数组再按序放回原数组中的原因。

0 1 2 3 4 5
1 2 4 4 6 8

放回原始数组中,也就是一次合并后原始数组可能出现的情况:

0 1 2 3 4 5 6 7 8 9 10
1 2 4 4 6 8 0 2 7 4 10

好了,基本逻辑就是这些.下面看一下代码:

 public static void main(String[] args){int a[]={2,4,6,8,1,4,0,2,7,4,10};merge_sort(a,0,a.length-1);ArrayUtils.printArray(a);//这里将排好后的结果输出,这个函数是写在另一个类中的静态输出函数。读者若嫌麻烦,不妨弄个for循环输出。}public static void merge_sort(int a[],int first,int end){if(first<end){    //这里划分一定要分成单个元素成派。理由很简单因为合并的基础是有序子数组。只有单个元素可以认为有序,多个则不然。int mid=(first+end)/2;  //采用中间划分//System.out.println(mid);//这里是我调试所用,不需要看merge_sort(a,first,mid);//这里是两条递归语句,就是划分派别。注意这里划分其实是划分的下标merge_sort(a,mid+1,end);merge(a,first,mid,end);//合并//  ArrayUtils.printArray(a);//调试所用,不用看}}public static void merge(int a[],int first,int mid,int end){Queue<Integer> q=new LinkedList<Integer>();//声明一个临时队列先进先出int indexA=first;//考虑一下为什么不直接使用first还需要再申请一个新的临时变量?答案在最后一句我们其实是在每合并一次就赋值回原数组一次。int indexB=mid+1;while(indexA<=mid&&indexB<=end){if(a[indexA]<=a[indexB]){  //谁小把谁优先加入临时队列q.offer(a[indexA]);indexA++;}else{q.offer(a[indexB]);indexB++;}      }while(indexA<=mid){          //这个队列还没比较完,依次加入队列q.offer(a[indexA]);indexA++;}while(indexB<=end){q.offer(a[indexB]);indexB++;}int index=0;while(q.size()>0){     //赋值回原始数组a[first+index]=q.poll();index++;}}

看到这里大家应该已经会了基数排序,但是我其实一直都对那个递归划分有些不是很清楚。所以为了弄清楚究竟如何递归的,我加了上面的两个输出语句。最后得出如下结论:

上面二叉树中的结点数字代表下标范围,分叉中间的数字就是mid值。这个二叉树有点丑,如果大家有这方面的画图工具不妨推荐一下。如果取消我的那两条调试语句注释,并对main函数中的排序后输出注释掉。可以看到输出结果如下:

5
2
1
0
{2, 4, 6, 8, 1, 4, 0, 2, 7, 4, 10}
{2, 4, 6, 8, 1, 4, 0, 2, 7, 4, 10}
4
3
{2, 4, 6, 1, 8, 4, 0, 2, 7, 4, 10}
{2, 4, 6, 1, 4, 8, 0, 2, 7, 4, 10}
{1, 2, 4, 4, 6, 8, 0, 2, 7, 4, 10}
8
7
6
{1, 2, 4, 4, 6, 8, 0, 2, 7, 4, 10}
{1, 2, 4, 4, 6, 8, 0, 2, 7, 4, 10}
9
{1, 2, 4, 4, 6, 8, 0, 2, 7, 4, 10}
{1, 2, 4, 4, 6, 8, 0, 2, 4, 7, 10}
{0, 1, 2, 2, 4, 4, 4, 6, 7, 8, 10}

从上面可以看出Java顺序执行,1.先执行二叉树的左分支一直到左侧不能划分为止,然后向上比较合并。2.边合并边赋值回原数组。所以结果才会出现乱中有序的输出啊。好了
以上就是我的见解。如有不当之处,敬请留言指点。互相学习,共同提高。最后贴出两篇其他牛人写的,也是我参考过的连接。http://mp.weixin.qq.com/s?src=3&timestamp=1463015893&ver=1&signature=ApxbrqJNHSesYNQ2UF1VYl3WwA0qgIacTPzCkimq1PGIb15WBWOxlrrkuiEiyzohBZcBbG8YWUPCHxPrmWu2M2urOMp-Rvpn70xOs7MSuIx5SXFo*jrFKEjT0jjr0tIxevtlBB8XQi8mqFHCiXUpvsDkEKTGahWOfSK1q5cyu3o=;

还有一篇博客http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html。再次声明,文章仅为学习交流之用。

java版基础排序归并排相关推荐

  1. JAVA红石_【Mc我的世界红石研究日记】第四期:红石基础元件(四)——JAVA版基础篇...

    Hello,大家好,欢迎来到Mc元气工作室!本期给大家带来Mc我的世界红石研究日记·第四期!版本:JAVA1.14.3. 第三期答题互动答案 以下哪一个选项被红石比较器检测出的红石信号与其他三项不同? ...

  2. java插入排序实现,经典(Java版)排序算法的分析及实现之一直接插入排序

    预备知识 排序算法从功能上是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列.从内存空间使用简单上看分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序,适合不太大的元素序列 ...

  3. 【Java】基础排序算法-插入排序

    基础排序算法-------插入排序 实现过程: 插入排序的过程就像整理桥牌的过程:每次将待排元素中的第一个元素插入到有序区间的合适位置,为了给当前待排元素腾出位置,需要将有序区间内所有大于待排元素的其 ...

  4. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

  5. 数据结构(java版)SortedSeqList(排序顺序表)

    SortedSeqList(排序顺序表) 代码部分: public class SortedSeqList<T extends Comparable<? super T>> e ...

  6. 经典排序算法(Java版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...

  7. 内部排序比较(Java版)

    内部排序比较(Java版) 2017-06-21 目录 1 三种基本排序算法 1.1 插入排序 1.2 交换排序(冒泡) 1.3 选择排序(简单) 2 比较 3 补充 3.1 快速排序 3.2 什么是 ...

  8. java内置排序有哪些_内部排序比较(Java版)

    内部排序比较(Java版) 2017-06-21 目录 1 三种基本排序算法 1.1 插入排序 public static void InsertSort(int[] arrs) {intj;intt ...

  9. Java零基础笔记自用版(一)

    系列文章目录 一.Java零基础笔记自用版(一) 目录 系列文章目录 前言 一.⭐️Java概述 二.⭐️变量 三.⭐️运算符 四.⭐️控制结构 五.⭐️数组.排序.查找 写在最后 前言 最近在学习J ...

最新文章

  1. win7访问不了服务器共享文件夹权限设置,win7系统开启共享文件夹访问权限的操作方法...
  2. 如何使用HTML5,CSS3和PHP创建一个联系表格
  3. Win32 API 浏览目录对话框示例
  4. 生成JSON数据--官方方法
  5. C语言函数strcmp()(比较两个字符串)
  6. 从零起步CMFCToolBar用法详解
  7. onvif_discover虚拟摄像头
  8. linux gtest安装
  9. 只要你上网,哪能不中毒?
  10. Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例
  11. 爱奇艺全国高校算法大赛初赛A
  12. c性能大容量cket_5千左右预算,既轻薄(高颜值)又高性能的笔记本推荐(兼顾Pr剪辑、Ps修图、CAD制图、办公游戏)...
  13. 《大数据之路:阿里巴巴大数据实践》-第1章 总述
  14. metaRTC5.0实现webrtc的TURN支持
  15. 域名whois查询接口代码
  16. tcl科技云计算机,科技点亮生活,TCL定义智慧科技新生活
  17. 欧文分校计算机科学硕士项目,申请2019加州大学欧文分校计算机科学硕士要求都有哪些?...
  18. 最全Pycharm教程(14)——Pycharm编辑器功能总篇
  19. 张艾迪(创始人):我们接管世界
  20. MobaXterm Professional v11.1 Build 3860 注册版-全功能SSH/X远程客户端-Xmanager最佳替代品

热门文章

  1. Python 第三方模块 科学计算 SciPy模块2 积分,插值
  2. 风控中的文本相似方法之余弦定理
  3. jlink的用法总结
  4. 【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图
  5. 用电脑发传真用无纸传真系统3GFAXorMYFAX
  6. UserInterface的使用总结篇(完结篇)
  7. linux系统ssh安装,安装ssh_Linux系统安装Autossh的方法
  8. 视频教程-SEO实战课程之站群优化-其他
  9. zabbix模板-天融信防火墙
  10. linux qt按键精灵,按键精灵QT抢夺脚本源码