归并排序的学习与java实现

import java.util.Arrays;
public class Sort_Merge {
//数组对比展示
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1,0};
System.err.println("未排序的数组:" + Arrays.toString(arr));
sort_merge(arr, 0, arr.length - 1);
System.err.println("排好序的数组:" + Arrays.toString(arr));
}
//循环调用
private static void sort_merge(int[] arr, int start, int end) {
int middle = (start + end) / 2;
if (start < end) {
sort_merge(arr, start, middle);  //根据下标将数组逻辑拆分
sort_merge(arr, middle + 1, end);  //根据下标将数组逻辑拆分
merge(arr, start, middle, end);   //对某递归层数下两个数组合并
}
}
private static void merge(int[] arr, int start, int middle, int end) {
// 定义临时数组及指针
int[] temp = new int[end - start + 1];
int i = start; // 左
int j = middle + 1; // 右
int t = 0; // 临时数组指针
// 两个子数组进行比较,将较小的元素放入临时数组中,同时对应数组指针+1;
while (i <= middle && j <= end) {
if (arr[i] < arr[j]) {
temp[t++] = arr[i++];
} else {
temp[t++] = arr[j++];
}
}
// 如果右数组先比较完成,即左数组仍有元素,将所有元素直接存入临时数组,反之亦然;
while (i <= middle) {
temp[t++] = arr[i++];
}
while (j <= end) {
temp[t++] = arr[j++];
}
// 将临时数组覆盖原数组对应下标的数据
for (int k = 0; k < temp.length; k++) {
arr[k + start] = temp[k];
}
}
}
posted @ 2017-12-26 14:23  天尘已经被注册  阅读(185)  评论(0编辑  收藏  举报