java归并排序(最精简代码)

时间:2022-05-06
本文章向大家介绍java归并排序(最精简代码),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class MergeSortTest {
	public void sort(int[] array, int left, int right) {
		if (left >= right)
			return;
		// 找出中间索引
		int center = (left + right) / 2;
		// 对左边数组进行递归
		sort(array, left, center);
		// 对右边数组进行递归
		sort(array, center + 1, right);
		// 合并
		merge(array, left, center, right);
		// 打印每次排序结果
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "t");
		}
		System.out.println();

	}

	/**
	 * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
	 * 
	 * @param array
	 *            数组对象
	 * @param left
	 *            左数组的第一个元素的索引
	 * @param center
	 *            左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
	 * @param right
	 *            右数组最后一个元素的索引
	 */
	public void merge(int[] array, int left, int center, int right) {
		// 临时数组
		int[] tmpArr = new int[array.length];
		// 右数组第一个元素索引
		int mid = center + 1;
		// third 记录临时数组的索引
		int third = left;
		// 缓存左数组第一个元素的索引
		int tmp = left;
		while (left <= center && mid <= right) {
			// 从两个数组中取出最小的放入临时数组
			if (array[left] <= array[mid]) {
				tmpArr[third++] = array[left++];
			} else {
				tmpArr[third++] = array[mid++];
			}
		}
		// 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
		while (mid <= right) {
			tmpArr[third++] = array[mid++];
		}
		while (left <= center) {
			tmpArr[third++] = array[left++];
		}
		// 将临时数组中的内容拷贝回原数组中
		// (原left-right范围的内容被复制回原数组)
		while (tmp <= right) {
			array[tmp] = tmpArr[tmp++];
		}
	}

	public static void main(String[] args) {
		int[] array = new int[] { 5, 69, 12, 3, 56, 789, 2, 5648, 23 };
		MergeSortTest mergeSortTest = new MergeSortTest();
		mergeSortTest.sort(array, 0, array.length - 1);
		System.out.println("排序后的数组:");
		for (int m = 0; m <= array.length - 1; m++) {
			System.out.print(array[m] + "t");
		}
	}
}