package algorithm;
/**
* Created by huaqiang.li on 2019/1/23.
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3};
sort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
/**
* @param arr 待排序数组
* @param low 左半部分数组指针(数组从low到mid)
* @param high 右半部分数组指针(数组从mid+1到high)
*/
private static int[] sort(int[] arr, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左半部分数组进行(归并)排序
sort(arr, low, mid);
// 右半部分数组进行(归并)排序
sort(arr, mid + 1, high);
// 归并左右两个数组
merge(arr, low, mid, high);
}
return arr;
}
private static void merge(int[] arr, int low, int mid, int high) {
int[] temp = new int[high - low + 1]; // 缓存排序数组
int lowP = low; // 左半部分数组指针
int highP = mid + 1; // 右半部分数组指针
int tempP = 0; // temp数组指针
// 将数组arr中low至high中相对更小的数放入temp数组
while (lowP <= mid && highP <= high) {
if (arr[lowP] <= arr[highP]) {
temp[tempP++] = arr[lowP++];
} else {
temp[tempP++] = arr[highP++];
}
}
// 将左半部分数组中剩余的数放入依次放入temp数组
while (lowP <= mid) {
temp[tempP++] = arr[lowP++];
}
// 将右半部分数组中剩余的数放入依次放入temp数组
while (highP <= high) {
temp[tempP++] = arr[highP++];
}
// 将temp数组覆盖到arr对应的low至high下标部分数组部分
for (int i = 0; i <= temp.length - 1; i++) {
arr[low + i] = temp[i];
}
}
}
归并排序
最新推荐文章于 2023-12-11 10:45:47 发布