Java实现归并排序
2016-05-07 16:24
477 查看
本文参考自:http://blog.csdn.net/morewindows/article/details/6678165
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
以下是实现
注:有的书上是在mergearray()合并有序数列时分配临时数组,但是过多的new操作会非常费时。因此作了下小小的变化。只在MergeSort()中new一个临时数组。后面的操作都共用这一个临时数组。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
//将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]){ int i, j, k; i = j = k = 0; while (i < n && j < m) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; }可以看出合并有序数列的效率是比较高的,可以达到O(n)。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
以下是实现
public class MergeSort { public static void main(String[] args) { int[] a = GenerateIntArray.getArray(); int[] temp = new int[a.length]; System.out.println(Arrays.toString(a)); mergeSort(a, 0, a.length - 1, temp);//只是用一个temp变量 System.out.println(Arrays.toString(a)); } //递归 static void mergeSort (int a[], int first, int last, int temp[]) { if (a == null || a.length < 1) { return; } if (first < last) { int mid = (first + last) / 2; mergeSort(a, first, mid, temp); mergeSort(a, mid + 1, last, temp); mergeArray(a, first, mid, last, temp); } } //合并 static void mergeArray (int a[], int first, int mid, int last, int[] temp) { int i = first, j = mid + 1, k = 0; while (i <= mid && j <= last) { if (a[i] <= a[j]) { temp[k++] = a[i++]; } else { temp[k++] = a[j++]; } } while (i <= mid) { temp[k++] = a[i++]; } while (j <= last) { temp[k++] = a[j++]; } for (i = 0; i < k; i ++) { a[first + i] = temp[i]; } } }
注:有的书上是在mergearray()合并有序数列时分配临时数组,但是过多的new操作会非常费时。因此作了下小小的变化。只在MergeSort()中new一个临时数组。后面的操作都共用这一个临时数组。
相关文章推荐
- java类加载方式
- Java IO流和装饰模式(Decorator)
- java浅拷贝与深拷贝详解
- struts.custom.i18n.resources
- JAVA中将一个时间段按固定间隔拆分为List
- Elasticsearch 常用的java操作
- java 泛型
- Spring 4 MVC 表单校验资源处理(带源码)
- Java之------类加载器(二)
- 转自:Java通过SMS短信平台实现发短信功能
- maven项目 加入json-lib-2.2.3-jdk15.jar 报错 Missing artifact net.sf.json-lib:json-lib:jar:2.4:compile
- Java线程
- Java基于Socket的简单推送
- java单例模式详解
- java代码获取各种时间
- Google Java 编程风格指南 —— 见微知著
- JAVA泛型中? T K V E等代表的意思
- 【Leetcode】:326. Power of Three 问题 in JAVA
- Spring hibernatecallback学习
- java double类型保留两位小数4种方法