归并排序的java实现
归并排序的优点不说了。
做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组。
思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有了,先比较两个数组的首元素,谁更小就放入结果数组里面,然后指针下移,继续比较,直到有一个数组为空,停止比较,因为是有序数组,那么不为空的数组后面的元素都比之前存入结果数组的要大,且是有序的,因此,只需将后面的数组存入结果数组即可。
接下来是代码实现:
/*
* 分治算法利用
* 两个有序数组的合并
* 将有序数组i,数组j,合并成c
*/
public Integer[] sort(Integer[] i, Integer[] j, Integer[] c){
c = new Integer[i.length+j.length];
int i1 = 0; //i的数组指针
int j1 = 0; //j的数组指针
int c1 = 0; //c的数组指针
while(i1 < i.length&&j1 < j.length){
if(i[i1] > j[j1]){
c[c1++] = j[j1];
j[j1++] = null;
}else{
c[c1++] = i[i1];
i[i1++] = null;
}
}
/*
* i之后还有元素
*/
while(i1<i.length){
c[c1++] = i[i1];
i[i1++] = null;
}
/*
* j之后还有元素
*/
while(j1 < j.length){
c[c1++] = j[j1];
j[j1++] = null;
}
return c;
}
以上实现了将两个有序数组的合并,而归并排序,那么将一条无序数组分组成任意多个有序数组即可,并不需要确认是否是有序数组,一个数组里一个元素肯定是有序的,那么我要做的只是,递归实现数组分解,然后将有两个序数组合并。
将一个数组分解,可以用分治的方法,定义头,尾,和中间指针,然后下次的递归,只需变换中间指针即可。
而排序最开始只需要比较头部的一个元素和尾部的一个元素;
依次向上递归。
算了,贴代码吧。
public int[] mergeSort(int[] num,int first,int last){
int mid = (first+last)/2;
if(first < last){
mergeSort(num,first,mid);
mergeSort(num,mid+1,last);
merge(num,first,mid,last);
}
return num;
}
public void merge(int[] num,int first,int mid,int last){
int _left = first; //左指针
int _right = mid+1; //右指针
int[] temp = new int[last - first + 1];
int temp_p = 0;
while(_left<=mid&&_right<=last){
if(num[_left]<num[_right]){
temp[temp_p++] = num[_left++];
}else{
temp[temp_p++] = num[_right++];
}
}
while(_left<=mid){
temp[temp_p++] = num[_left++];
}
while(_right<=last){
temp[temp_p++] = num[_right++];
}
_left = 0;
//因为没有返回数组,所以排序好的数组应该放在num数组里面,直接覆盖即可,注意下标。
for(int i : temp){
num[(_left++)+first] = i;
}
}
first,last为数组头尾指针。
归并排序的java实现的更多相关文章
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)
原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...
- leecode 归并排序 链表(java)
写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...
- 排序算法入门之归并排序(java实现)
归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...
- 归并排序算法-Java实现
简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...
- 递归-归并排序 思想 JAVA实现
已知一个数组 15.58.61.75.21.32.89.4.78.83.采用递归实现的归并排序将数组有序. 分治策略:(摘自<算法导论>) 在分治策略中,我们采用递归解决问题 分解:将 ...
- 归并排序算法Java实现
一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
- 排序系列 之 归并排序算法 —— Java实现
基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...
- 排序算法-归并排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 201 ...
随机推荐
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- H5单页面手势滑屏切换原理
H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...
- 使用Oracle官方巡检工具ORAchk巡检数据库
ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...
- 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
- Dynamics CRM 之ADFS 使用 WID 的独立联合服务器
ADFS 的使用 WID 的独立联合服务器适用于自己的测试环境,常用的就是在虚机中使用. 拓扑图如下: wID:联合身份验证服务配置为使用 Windows 内部数据库
- Android Weekly Notes Issue #237
Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...
- 拦截UIViewController的popViewController事件
实现拦截UIViewController的pop操作有两种方式: 自定义实现返回按钮,即设置UIBarButtonItem来实现自定义的返回操作. 创建UINavigatonController的Ca ...
- 查看mac中磁盘空间占用情况
今天发现磁盘空间不够了,首先要找到那些文件夹占用了磁盘空间. du命令很好使 du -c -d 1 -m | sort -n -c 显示当前文件夹总计占用空间 -d 1 层级为1,即只显示当前目录下一 ...
- DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
弹出页面控件:ASPxPopupControl, <dxpc:ASPxPopupControl ID="popubCtr" runat="server" ...