您的位置:首页 > 编程语言 > Java开发

Java实现归并排序

2016-05-07 16:24 477 查看
本文参考自:http://blog.csdn.net/morewindows/article/details/6678165

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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一个临时数组。后面的操作都共用这一个临时数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: