归并排序
思路:依照分治模式
分解:将n个元素分成各含n/2个元素的子序列;
解决:对两个子序列递归地排序
合并:合并两个已排序的序列的子序列以得到排序结果
和快排区别:
归并的分解较为随意,重点是合并

对下列数组元素进行排序

两边数组各自进行排序
特殊情况当出现右区间数组元素个数比左区间元素个数多时,可以不用管
还有一种特殊情况当出现左区间数组元素个数比右区间元素个数多时
伪代码

MergerSortmergeSort(A,p,r){  //数组A,左指针p,右指针r if(p<r){   //左指针指的元素小于右指针指的元素 mid=p+((r-p)>>1);  //找中间值 mergeSort(A,p,mid);  //左区间 mergeSort(A,mid+1,r);  //右区间 merge(A,p,mid,r);    //整个数组 }} helper=[A.length];    //开辟一个和原数组长度相同的辅助区间 merge(A,p,mid,r){   copy(A,p,helper,p,r-p+1){  //先把A中的数据拷贝到helper中left=p  //左侧队伍的头部指针,指向待比较的元素right=mid+1  //右侧队伍的头部指针,指向待比较元素current=p  //原数组的指针,指向待填入数据的while(left<=mid&&right<=r){    //左边走的块,已经到头 if(helper[left]<=helper[right]){A[current]=helper[left];current++;left++;}else{A[current]=helper[right];current++;right++;}} if(left<=mid){A[current]=helper[left];current++;left++;}} }

代码

package mergesort;import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;public class Mergesort {private static int[] helper;  //开辟一个辅助空间helper=new int[arr.length];sort(arr,0,arr.length-1);  //排序
}//分成两段分别排序,然后再合并
private static void sort(int[] A,int p,int r) {if(p<r) {   //左指针小于右指针int mid=p+((r-p)>>1);  //求中间位置sort(A,p,mid);  //对左侧排序sort(A,mid+1,r);   //对右侧排序merge(A,p,mid,r);   //合并}
}
//假设数组的两段分别有序,借助一个辅助数组来缓存原数组,用归并的思路将元素从辅助数组中拷贝原数组
//A原数组        p低位    mid中间位     r高位
private static void merge(int[] A,int p,int mid,int r) {//拷贝到辅助空间的相同位置
System.arraycopy(A,p,helper,p,r-p+1);
int left=p,right=mid+1;  //辅助数组的两个指针
//原始数组的 指针
int current=p;  //当前指针指向
while(left<=mid&&right<=r) {  //当左指针走的块已经到头if(helper[left]<=helper[right]) {  //辅助空间的左指针小于右指针A[current++]=helper[left++];   //当前指针在左指针位置}else {A[current++]=helper[right++];}
}
//可能出现左边指针可能没有到头,右边的没有到头可以不管
while(left<=mid) {A[current]=helper[left];current++;left++;
}
}
public static void main(String[] args) {   int[] arr=Util.getRandomArr(10,1,100);  //测试指针Util.print(arr);sart(arr);Util.println(arr);Assertions.assertThat(Util.checkOrdered(arr,true)).isTrue();
}
}

归并排序(数组指针详细讲解,图例分析)相关推荐

  1. c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...

  2. C语言——指针详细讲解

    目录 一.指针 二.字符指针 三.指针数组 四.数组指针 五.数组参数.指针参数 六.函数指针 七.函数指针数组 八 .指向函数指针数组的指针 九.回调函数 十.深度解析指针和数组 一.指针 (一). ...

  3. 第八篇,字符数组和字符指针详细讲解。

    一.字符数组. 1.什么是字符数组? 在一个数组中,每一个成员都是一个字符 例如: char A[3]   --> 每一个成员都是字符类型的数据,组成一个字符串. 2.字符数组的赋值? char ...

  4. javascript中常用数组方法详细讲解

    javascript中数组常用方法总结 1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔 ...

  5. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. JAVA数组详细讲解

    在程序开发过程中,有时候需要存储大量的同类型数据.例如,存储一个班级50名学生的姓名,这时需要定义50个变量来保存姓名数据,但这种做法太繁琐了.那么,如何解决这类问题呢?Java语言提供了数组结构,它 ...

  7. 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析

    数组指针与指针数是非常重要的概念.面试中也是经常会被问到的 文章目录 1 数组的类型 1.1 定义数组的类型 2 数组指针 2.1 数组类型和数组指针的代码分析 3 指针数组 3.1 指针数组代码案例 ...

  8. 【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)

    目录 概述 内存 内存含义 内存作用: 物理存储器和存储地址空间 物理存储器:实际存在的具体存储器芯片. 存储地址空间:对存储器编码的范围. 内存地址 指针和指针变量 指针基础知识 指针变量的定义和使 ...

  9. Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)

    Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) Java对象 转 JSON字符串 JAVA对象转MAP Map转java对象 List转map List和Map ...

最新文章

  1. Swift - 异常处理
  2. 一步一步详解ID3和C4.5的C++实现
  3. [USACO1.2]方块转换 Transformations
  4. 集美大学1414班软件工程个人作业2——个人作业2:APP案例分析
  5. 开源项目cardslib简单介绍和导入eclipse并运行的方法
  6. 解决PowerPoint英语课件配音难同步的问题
  7. 开始我的.NET的学习旅程
  8. 如何更改itunes备份位置_Win10系统怎样设置itunes备份位置
  9. 10win重启计算机黑屏,win10启动后黑屏怎么回事_windows10开机启动黑屏如何解决
  10. 葵花宝典:软件开发高手是这样炼成的!
  11. 恒峰祥可信讲述拼多多电商店铺推广和商品推广有什么不同
  12. c语言编程矩阵鞍点函数,c语言 任意输入一个3×3的矩阵,用函数实现求上三角矩阵并输出。...
  13. can收发器 rx_MCU如何扩展CAN/CAN FD接口?
  14. nextcloud——搭建自己的云盘
  15. 艺赛旗RPA 第三方库系列(二):提升 pip 工具的下载速度
  16. 阿里巴巴2015校招电面
  17. 国庆来临,外贸人出货必须注意的几个点(附节日营销技巧)
  18. 中日企业文化不可思议的五项潜规则
  19. Android逆向之路---让你的微信地区来自火星
  20. 哈工大2022年传输原理期末试题

热门文章

  1. python资料-大牛分享python资料
  2. python和c 的区别-Python和C区别该如何理解?如何适应这种区别?
  3. 提高语音识别率:必须加入深度学习吗?
  4. CSS-Position用法的理解
  5. mysql中Group_concat,查找列名,将字符串转换为数字比较大小等杂项记录
  6. mysql日期排序YMD_php将二维数组按日期(支持Ymd和Ynj格式日期)排序
  7. 印象笔记电脑版使用技巧_苏江:打造你的第二大脑,印象笔记的5个超级使用技巧...
  8. python中的缩进是长度统一吗_python缩进长度是否统一
  9. Express框架的请求处理~非常详细
  10. redux,react-redux之间的关系