我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因。但是随着时间的发展,我们总会感觉,这一类人如果不提升自己,最后也只会是一个码农。技术会日新月异,随时在发展更新换代,但是这几十年,有谁说过算法会过时,如果我们说java语言的发动机是各种开发手段和技术,那么我们可以毫不客气的说算法会是他的灵魂。一个程序员的提升和拔高一定是万丈高楼平地起,那么我希望这个地基一定是数据结构和算法,掌握这些原理以后其实在以后的学习过程当中我们会异常的轻松。

    首先,我们需要掌握几种最基本的排序方式,比如简单排序,插入排序,快速排序,堆排序,冒泡排序,选择排序,希尔排序,归并排序。每一种排序方式都有自己的特点,数据量的大小或者说对时间复杂度,空间复杂度的要求都可以选择合适的排序方式进行排序。就我个人而言,因为在我学习的过程中对归并排序情有独钟,所以今天我们在这里介绍一下归并排序。我们这将演示归并排序的java实现代码,以及归并的特点,它的时间复杂度和空间等等的问题计算。

    一:归并排序的特点:

        归并排序的特点第一点就是它是一个比较有代表性的分而治之思想的排序方式,其中渗透着递归的思想,当我们面对一大堆复杂的复杂的数据无从下手时,或许分而治之就是我们的首选,这就确定了归        并排序最好是在数据量比较大,对空间复杂度要求不高,对时间复杂具有一定要求的情况下使用。因为它在不断的递归拆分数据的过程中会占用栈的空间。说到这里可能有点迷糊,那我们直接上代码         看如何实现归并排序。

    二:代码实现:

        第一步:我们称之为归并,那么必然涉及到了合并,如果有合并,那么必然会有相对应的拆分。在这一步我们对应的就是sort方法,让一个完整的数组进行不断的拆分,直到最后的数据单元是一个单独        的数据位置,这时候在进行第二步,就是从小往上不断地对分开的数据进行整合。

        第二步:也就是我们看到的mergeArray()方法,它是通过一个临时数组最为一个临时的容器,将比较过后的有序数组存储进去,然后再取出赋值给原始数据。这里需要提出几个比较需要理解的地方,

            第一点:就是我们在进行合并的时候是合并middle数据两边的数据集合,通过比较,让小的进入临时数组,角标加一,在进行比较,直到一个数据集合到底位置。

            第二点:我们在进行比较以后必然会有一个数据集合会留下一些数据没有进行插入,这时候我们就比较他们的开始和结束的角标,如果不等于那么就把这个数据集合里面的数据继续通过while                循环加入我们的临时数组中。

            第三点:我们在最后的时候,把临时数组中的数据加入原始数组,必须记住要加上start这个数值,因为我们都知道在合并的时候,我们左右是同时进行的,左边的数据可能是从0开始,但是右                边的数据就不见得了,所以我们要加上合并开始的位置start。

            第四点:一定要注意一个事情,算法看懂很困难,但是我们或许需要实践,在运算的逻辑处理不理解时,可以在草稿纸上进行过程分解,或者通过源代码进行debag模式,分析数据的走向。

 1 public static void sort(int arr[],int emp[],int start,int end){
 2        //对是否继续拆分递归进行判断
 3          int middle = start + (end - start) / 2;
 4          if(start < end){
 5                sort(arr,emp,start,middle);//让左边的数据进行拆分并实现有序
 6                sort(arr,emp,middle + 1,ens);//让右边的数据进行拆分并实现有序
 7                mergeArray(arr,emp,start,middle,end);//进行合并
 8          }
 9 }
10 public static void mergeArray(int arr[],int emp[],int start,int middle,int end){
11          int i = start,j = middle;
12          int k = middle + 1,z = end;
13          int x = 0;
14          //判断那个数据大小插入临时数组
15          while(i <= j&& k <= z){
16               if(arr[i] < arr[k]){
17                   emp[x++] = arr[i++];
18                }   else{
19                        emp[x++] = arr[k++];
20                }
21           }
22         //当我们经拆分好的两边数据插入临时数组以后肯定还有未完成的数据在原始数组中
23         //继续进行数据清理,加入临时数组
24         while(i <= j){
25             emp[x++] = arr[i++];
26        }
27         while(k <= z){
28             emp[x++] = arr[k++];
29        }
30         //所有数据进入临时数组以后我们将数据导出,放入原始数组中,这些数据必然有序
31        for(i = 0;i < x;i++){
32             arr[start + i] = emp[i];
33        }
34
35 }                                        

      三:算法过程分析图:

          

    四:归并的时间复杂度计算和分析: 对于这一块来说我们或许可以试着去尝试理解,对于各方面的综合考虑来说对于初学者可能比较有难度。  

      可以说合并排序是比较复杂的排序,特别是对于不了解分治法基本思想的同学来说可能难以理解。总时间=分解时间+解决问题时间+合并时间。

          分解时间:把一个待排序序列分解成两序列,时间为一常数,时间复杂度o(1).

          解决问题时间:两个递归式,把一个规模为n的问题分成两个规模分别为n/2的子问题,时间为2T(n/2).合并时间复杂度为o(n)。

          总时间:T(n)=2T(n/2)+o(n).这个递归式可以用递归树来解,其解是o(nlogn).此外在最坏、最佳、平均情况下归并排序时间复杂度均为o(nlogn).从合并过程中可以看出合并排序稳定。

          用递归树的方法解递归式T(n)=2T(n/2)+o(n):假设解决最后的子问题用时为常数c,则对于n个待排序记录来说整个问题的规模为cn。

           

          从这个递归树可以看出,第一层时间代价为cn,第二层时间代价为cn/2+cn/2=cn.....每一层代价都是cn,总共有logn+1层。所以总的时间代价为cn*(logn+1).时间复杂度是o(nlogn)

转载于:https://www.cnblogs.com/zslli/p/7928695.html

数据结构和算法之排序一:归并排序相关推荐

  1. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. 数据结构与算法(三) 排序算法(代码示例)

    数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...

  4. 数据结构与算法之排序算法

    数据结构与算法之排序算法 排序算法的介绍 ​ 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排序的过程. 排序的分类 1)内部排序:指将需要处理的数据都加载到内部 ...

  5. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  6. python数据结构与算法之排序

    排序算法的稳定性: 假设有一串数据:(4,1)(3,1)(3,7)(5,6):要求按照第一个数排序,结果如下: 第一种:(3,1)(3,7)(4,1)(5,6)(3相同,维持原来的次序) 第二种:(3 ...

  7. 【数据结构与算法】排序优化

    冒泡.插入.选择 O(n^2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 总结:如何实现一个通用的高性能的排序函数? 一.如何选择合适的排序算法? 1.排 ...

  8. 数据结构与算法——列表排序(一篇文章带你了解排序算法)

    数据结构与算法基础 列表排序: 什么是列表排序? 排序:将一组"无序"的记录序列调整为"有序"的记录序列. 列表排序:将无序列表变为有序列表. 内置函数:sor ...

  9. 【数据结构与算法】排序 冒泡、插入、选择 O(n^2)

    冒泡.插入.选择 O(n2) 基于比较 快排.归并 O(nlogn) 基于比较 计数.基数.桶 O(n) 不基于比较 一.如何分析一个排序算法? 学习排序算法的思路?明确原理.掌握实现以及分析性能. ...

最新文章

  1. 使用docker安装部署Spark集群来训练CNN(含Python实例)
  2. 内建函数对象(STL)
  3. java获取2017年第39周_java中怎么样取出39周的每周开始时间和每周结束时间?
  4. [长流支流]的专栏--《金质打印通》、《WebMIS.NET快速开发平台》,MIS/ERP开发利器...
  5. 要闻君说:FaceTime的服务究竟坑有多大?CNCF 技术监督委员会首添中国面孔,来自阿里!高通华为暂和解……...
  6. java中的生产者消费者模式详解
  7. Jzzhu and Sequences(CF-450B)
  8. socket接收的消息怎么更新到页面_利用socketio实现简易即时消息服务
  9. Linux下xargs命令的使用
  10. lodopa5预览时默认横向_微软Windows 10 20H1预览版18922开始推送,附更新内容
  11. Mysql主备延迟的来源
  12. Redis(1)——NoSQL数据库简介
  13. Javascript时间脚本收集
  14. 生物信息相关国家自然科学基金汇总(持续更新中)
  15. 互联网盈利模式,网络策划运营模式
  16. c语言char储存字符串,在c语言中char型数据在内存中的储存形式为什么
  17. swarm集群搭建教程
  18. SQLServer下载安装详细图解
  19. WebDriverException: Message: unknown error: cannot find Chrome binary(ChromeDriver及谷歌官网下载地址)
  20. 微信打开网址提示在浏览器中打开的办法

热门文章

  1. centos7安装ssh服务
  2. C++的hashmap和Java的hashmap
  3. 在后台中高效工作 – 后台任务
  4. 卡布教你:脸上长痘痘平时要注意什么呢
  5. 1-Tenor AF AFT400-实战-基本配置
  6. C# 中构造函数与析构函数(二)
  7. 程序员创业的两难困境
  8. 为 Office 2007/2010 安装程序整合 Service Pack 及更新程序
  9. Cesium多屏展示
  10. linux挑战:历史命令_博客挑战:分享您关于社区运作方式的知识