归并排序的思想简单,但是实现起来有点难,思想就是通过将数组分开,然后将数组合并起来,但是,注解的问题我过一段时间补上,感觉对递归理解的还不够透彻。对了以下的代码来自百度百科
代码:
package com.jk.merge;
import java.util.Arrays;
/**
*
* @author jk 这段代码来自百度百科,这个是归并排序,归并算法的思想很简单,可能是我对递归理解的还不够深刻,写这段代码的时候感觉还有点难,
* 递归就是将一个数组分开,然后将数组合并起来的过程,其实我感觉就和插入差不多的,只是它要小一些
*
*/
public class test {
public static void main(String[] args) {
int[] a = new int[] { 1, 5, 2, 66, 7, 3 };
mergeSort(a, 0, 1);
System.out.println(Arrays.toString(a));
}
private static void mergeSort(int[] a, int s, int len) {
int size = a.length;
int mid = size / (len << 1);
int c = size & ((len << 1) - 1);
if (mid == 0)
return;
for (int i = 0; i < mid; i++) {
s = i * 2 * len;
merge(a, s, s + len, (len << 1) + s - 1);
}
if (c != 0) {
merge(a, size - c - 2 * len, size - c, size - 1);
}
mergeSort(a, 0, 2 * len);
}
/**
*
* @param 原来的数组
* @param 第一个有序表的起始下标
* @param 第二个有序表的起始下标
* @param 第三个有序表的结束下标
*/
private static void merge(int[] a, int s, int m, int t) {
int[] tmp = new int[t - s + 1];
int i = s, j = m, k = 0;
while (i < m && j <= t) {
if (a[i] <= a[j]) {
tmp[k] = a[i];
k++;
i++;
} else {
tmp[k] = a[j];
j++;
k++;
}
}
while (i < m) {
tmp[k] = a[i];
i++;
k++;
}
while (j <= t) {
tmp[k] = a[j];
j++;
k++;
}
System.arraycopy(tmp, 0, a, s, tmp.length);
}
}