package com.wzs;
import java.util.Arrays;
/**
* 算法导论--page18
*
* @author Administrator
*
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
System.out.println("排序前:" + Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1);
System.out.println("排序后:" + Arrays.toString(arr));
}
/**
* 归并排序算法
*
* @param arr
* 需要排序的数组
* @param start
* 数组开始的位置
* @param end
* 数组结束的位置
*/
static void mergeSort(int[] arr, int start, int end) {
if (start < end) {
int middle = (start + end) / 2;
mergeSort(arr, start, middle);
mergeSort(arr, middle + 1, end);
merge(arr, start, middle, end);
}
}
/**
* 归并操作
*
* @param arr
* 需要归并的数组
* @param start
* 数组开始位置
* @param middle
* 数组中间位置
* @param end
* 数组结束位置
*/
static void merge(int[] arr, int start, int middle, int end) {
int[] tempArr = new int[arr.length];
int mid = middle + 1;
// midIndex记录中间数组的索引
int midIndex = start;
int tmp = start;
while (start <= middle && mid <= end) {
// 从两个数组中取出最小的放入中间数组
if (arr[start] <= arr[mid]) {
tempArr[midIndex++] = arr[start++];
} else {
tempArr[midIndex++] = arr[mid++];
}
}
// 剩余部分依次放入中间数组
while (mid <= end) {
tempArr[midIndex++] = arr[mid++];
}
while (start <= middle) {
tempArr[midIndex++] = arr[start++];
}
// 将中间数组中的内容复制回原数组
while (tmp <= end) {
arr[tmp] = tempArr[tmp++];
}
System.out.println(Arrays.toString(arr));
}
}
算法导论_归并排序
最新推荐文章于 2022-07-24 17:20:57 发布