归并排序运用了分治法的思想。
两个有序子数组可以以O(n)的时间复杂度进行合并。
当有序子数组长度s=1时,数组中有n/1个有序子数组,合并后有序子数组长度加倍变为2。
当有序子数组长度s=2时,数组中有n/2个有序子数组,合并后有序子数组长度加倍变为4。

当有序子数组长度s=n/2时,数组中有2个有序子数组,合并后有序子数组长度加倍变为n。
此时数组已经完全有序。
时间复杂度分析:
s的序列是:1,2,4, 8,….log2(n)
因此划分子数组的操作的时间复杂度是log(n)
合并子数组的时间复杂度是O(n)
因此归并排序的时间复杂度是:O(n*log(n))

public class MergeSortDemo {public static void main(String[] args) {int arr[]={2,3,5,1,4,9,8,7,6,0};MergeSort(arr);for (int i : arr) {System.out.println(i);}}public static void MergeSort(int[] x){int s=1;//字数组初始长度为1,只有单个元素的数组是有序的。int n=x.length;System.out.println("数组长度为:"+n);int[] y=new int[n];//用于存储合并后的数组while(s<n){//将 n/s 个长度为 s 的子数组 合并到y数组中,有序的子数组的长度变为2sMergePass(x,y,s,n);s+=s;//长度加倍//将 n/s 个长度为 s 的子数组 合并到y数组中,有序的子数组的长度变为2sMergePass(y,x,s,n);s+=s;//长度加倍}}/** 合并总数组中的相邻子数组* s:子数组长度* n:总数组长度*/public static void MergePass(int []x,int[] y,int s,int n){int i=0;//剩余的未合并段的长度大于等于2*s时while(n-i >= 2*s){//合并大小为s的相邻两段子数组Merge(x,y,i,i+s-1,i+s*2-1);i+=2*s;}//剩下的未合并元素个数小于2sif(n-i > s){//剩余的元素个数大于sMerge(x,y,i,i+s-1,n-1);}else {//剩余的元素个数小于等于sfor(int j=i;j<=n-1;j++){y[j]=x[j];}}}/** 合并两个有序数组为一个有序数组* l:第一个数组的左边界* m:第一个数组的右边界(第二个数组的左边界就是m+1)* r:第二个数组的左边界* 第一个数组:x[l...m]* 第二个数组:x[m+1...r]*/public static void Merge(int[] x,int []y,int l,int m,int r){int i=l,j=m+1,k=l;while((i<=m)&&(j<=r)){if(x[i] <= x[j]){y[k++]=x[i++];}else {y[k++]=x[j++];}}if(i>m){for(int q=j;q<=r;++q){y[k++]=x[q];}}else {for(int q=i;q<=m;++q){y[k++]=x[q];}}}
}

转载于:https://www.cnblogs.com/infoflow/p/7535860.html

归并排序算法分析与实现相关推荐

  1. 二分归并排序算法分析

    数组排序 使用二分归并排序算法,对n个不同的数构成的数组A[1-n]进行排序,其中n=2^k 算法思想 二分归并排序是一种分治算法.这个算法不断地将一个数组分为两部分,分别对左子数组和右子数组排序,然 ...

  2. 排序算法总结之归并排序

    一,归并排序介绍 归并排序是一个典型的基于分治的递归算法.它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划 ...

  3. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  4. 【数据结构-排序】4.图解归并排序和基数排序

    归并排序 排序思想 归并排序就是将两个或两个以上的有序表组合成一个新的有序表 从代码结构来看,归并排序类似树的后序遍历 -- (参考快速排序,类似树的先序遍历) 归并排序算法分析 归并排序的时间复杂度 ...

  5. 排序算法之——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 O ( n 2 ) O(n^2) O(n2),只适合小规模的数据.今天,我们来认识两种时间复杂度为 O ( n l o g n ) O(nlog ...

  6. 详解面试手撕过的那些排序算法

    前言 只要去大厂面试,必定有一轮算法面试,而这一轮往往是阻碍程序员面试成功的关键.一个程序员的算法基本功是否扎实能够体现出自身的开发能力,下面我尽可能的把常用的排序算法讲清楚. 排序简介 排序(Sor ...

  7. 直接插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序的算法分析和具体实现 ...

    排序分为内部排序和外部排序 内部排序是把待排数据元素全部调入内存中进行的排序. 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法. 比较排序算法优劣的标 ...

  8. 算法分析-分治 归并排序,递归插入排序,二分查找

    反正分治的套路就是 相同子问题,递归做,我之前有介绍express源码,其中的中间件使用就是用next()函数一直递归,想看的看我的express源码分析: 分治3步骤: 分解 处理 归并 下面给出归 ...

  9. 线性排序算法分析总结

    线性排序(Linear sort),指的是 时间复杂度为 O(n) 的排序算法.之所以时间复杂度能达到线性,是因为这种排序不是基于比较的,但它的适用场景也有很大的局限性. 线性排序有三种:桶排序.计数 ...

最新文章

  1. Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置...
  2. 剑指offer六十一之序列化二叉树(待补充)
  3. 浅谈工作流引擎的几个关键因素
  4. java 自定义http头_HttpClient自定义HTTP头
  5. vue方法调用失败后多次调用_浅析Vue中 computed / watch / methods的区别
  6. 直接用自己服务器做图床可以吗_我花 9 块钱搭了一个“私人图床”
  7. 《剑指offer》构建乘积数组
  8. RabbitMQ详解(三)
  9. lora技术在无线抄表行业应用
  10. 规培手册填写模板_9年老资料员经验分享,181套资料员模板+302页工作手册,成为优秀资料员还能提高工作效率,限时分享...
  11. SPOJ NSUBSTR(后缀自动机)
  12. 算法每日学打卡:01-21打卡(解答后面整理)
  13. 微信小程序直播助力深圳线上购物节 数百场品牌小程序开播
  14. 蓝屏代码大全 蓝屏全攻略
  15. 使用seafile创建个人云(类似百度云)
  16. 新能源汽车前景广袤但痛点多多,大圆柱电池能否提供最优解?
  17. 前端提高篇(三十九)CSS进阶7:columns多列布局
  18. Excel如何输入负数
  19. 如何创建NEO轻客户端
  20. java基于微信小程序的英语学习激励系统-计算机毕业设计

热门文章

  1. linux write的行为
  2. 【DevOps研发管理方案】四:持续集成 持续交付
  3. 电子商务-任务分配背景会议
  4. CCF-CSP认证历年真题解(100分)
  5. html论文参考文献m,论文与排版
  6. 【Apache Spark 】第 10 章使用 MLlib 进行机器学习
  7. 文献检索课程笔记3——论文写作
  8. 案例 6-1.3 哥尼斯堡的“七桥问题”(25 分)
  9. CVTE 2021 春招面经
  10. python删除一列数据_python删除txt第一列数据库