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

java实现归并排序

2016-05-13 10:48 537 查看
import java.util.Arrays;

public class MergSort {
public static void mergSort(int[] data) {
// 建立临时数组,最后要在merge里面用
// 在这里建立而不在merge里面建立的原因是减少new临时数组的次数,加快程序效率
int[] temp = new int[data.length];
// 调用merg_Sort
merg_sort(data, temp, 0, data.length - 1);
}

public static void merg_sort(int[] data, int[] temp, int left, int right) {
// 递归头,每次递归都要有递归头
if (left >= right)
return;
// merg_Sort的主要作用是分治,也就是切割原来的数组,并不做排序
int middle = (left + right) / 2;
merg_sort(data, temp, left, middle);
merg_sort(data, temp, middle + 1, right);
// 调用merg
merge(data, temp, left, middle + 1, right);
}

// 主要逻辑函数,负责把2个数组按大小次序合并成一个数组
// 上一个函数已经把数组拆分成单个元素,所以可以调用此函数,进行合并
public static void merge(int[] data, int[] temp, int left, int middle, int right) {
// 先要把left和middle保存起来,否则等会移动后找不到了
int i = left;
int j = middle;
// 合并后的数组的索引
int cur = left;
// 迭代的条件,两个数组都还有元素
while (i <= middle - 1 && j <= right) {
// 左边数组比右边小就把左边数组拷贝进新数组
while (i <= middle - 1 && data[i] <= data[j])
temp[cur++] = data[i++];
// 右边数组比左边小就把右边数组拷贝进新数组
while (j <= right && data[j] <= data[i])
temp[cur++] = data[j++];
}
// 把没有拷贝完成的数组拷贝到新数组
while (i <= middle - 1)
temp[cur++] = data[i++];
while (j <= right)
temp[cur++] = data[j++];
// 把新数组的元素拷贝到原来数组
for (int m = left; m <= right; m++)
data[m] = temp[m];
}

public static void main(String[] args) {

// 测试mergSort
// int[] data = { 5, 4, 3, 2, 1 };
// int[] data = { 2, 3, 1, 5, 4, 8, 6, 7, 3, 8, 9, 1 };
int[] data = { 2, 0, 1 };
mergSort(data);
System.out.println(Arrays.toString(data));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 归并排序 递归