package Sai.XiaoMI;
/**
* 2) 归并排序
*
* @author WangSai
*
*/
public class Solution {
/**
* @param args
*/
public static void main(String[] args) {
}
/**
* 2,归并排序,在原数组的基础上对原数组进行排序
*
* @param arr,待排序数组
*/
private static void mergeSort(int[] arr) {
if (arr == null || arr.length <= 0)
throw new IllegalArgumentException("非法输入参数,请重新检查...");
int low = 0;
int high = arr.length - 1;
mergeSortCore(arr, low, high);
}
private static void mergeSortCore(int[] arr, int low, int high) {
if (low >= high)
return;
int middle = (low + high) / 2;
// 二路归并
mergeSortCore(arr, low, middle);
mergeSortCore(arr, middle + 1, high);
// 合并
Merge(arr, low, middle, high);
}
private static void Merge(int[] arr, int low, int middle, int high) {
// 创建临时数组
int[] newArr = new int[arr.length];
// 临时数组的角标
int index = low;
// 左侧数组起始角标
int startl = low;
// 右侧数组起始角标
int startr = middle + 1;
// 合并两个数组
while (startl <= middle && startr <= high) {
if (arr[startl] < arr[startr]) {
newArr[index] = arr[startl];
index++;
startl++;
} else {
newArr[index] = arr[startr];
index++;
startr++;
}
}
// 将剩余的数字拼接到数组后面
while (startl <= middle) {
newArr[index++] = arr[startl++];
}
// 将剩余的数字拼接到数组后面
while (startr <= high) {
newArr[index++] = arr[startr++];
}
// 修改原数组
for (int i = low; i <= high; i++) {
arr[i] = newArr[i];
}
}
}
剑指offer-归并排序
最新推荐文章于 2021-03-03 15:02:04 发布