归并排序的优点不说了。

  做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组。

  思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有了,先比较两个数组的首元素,谁更小就放入结果数组里面,然后指针下移,继续比较,直到有一个数组为空,停止比较,因为是有序数组,那么不为空的数组后面的元素都比之前存入结果数组的要大,且是有序的,因此,只需将后面的数组存入结果数组即可。

  接下来是代码实现:

/*
* 分治算法利用
* 两个有序数组的合并
* 将有序数组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实现的更多相关文章

  1. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  2. Java基础(48):归并排序的Java封装含原理,完整可运行,结合VisualGo网站更好理解)

    原理: 归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序, ...

  3. leecode 归并排序 链表(java)

    写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...

  4. 排序算法入门之归并排序(java实现)

    归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...

  5. 归并排序算法-Java实现

    简介: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序 基本思想: 将一个无序数组,利用 ...

  6. 递归-归并排序 思想 JAVA实现

    已知一个数组   15.58.61.75.21.32.89.4.78.83.采用递归实现的归并排序将数组有序. 分治策略:(摘自<算法导论>) 在分治策略中,我们采用递归解决问题 分解:将 ...

  7. 归并排序算法Java实现

    一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...

  8. 排序系列 之 归并排序算法 —— Java实现

    基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...

  9. 排序算法-归并排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 201 ...

随机推荐

  1. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  2. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

  3. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  4. C语言 · 整数平均值

    编写函数,求包含n个元素的整数数组中元素的平均值.要求在函数内部使用指针操纵数组元素,其中n个整数从键盘输入,输出为其平均值. 样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以 ...

  5. Webpack 配置摘要

    open-browser-webpack-plugin 自动打开浏览器 html-webpack-plugin 通过 JS 生成 HTML webpack.optimize.UglifyJsPlugi ...

  6. mysql 学习总结

    MYSQL的增.删.查.改   注册.授权 #创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME.TABLENAME可以用*替换,表 ...

  7. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  8. Web安全相关(四):过多发布(Over Posting)

    简介 过多发布的内容相对比较简单,因此,我只打算把原文中的一些关键信息翻译一下.原文链接如下: http://www.asp.net/mvc/overview/getting-started/gett ...

  9. HTTP API接口安全设计

    HTTP API接口安全设计 API接口调用方式 HTTP + 请求签名机制   HTTP + 参数签名机制 HTTPS + 访问令牌机制 有没有更好的方案? OAuth授权机制 OAuth2.0服务 ...

  10. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...