归并排序—Java版

时间:2023-03-09 14:43:08
归并排序—Java版

一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习。

public class MergeSort {
	/**
	 * 归并排序
	 * @param nums 待排序数组
	 * @param low 初始索引
	 * @param high 结尾索引
	 * @return 输出排序完成的数组
	 */
	public static int[] mergeSort(int[] nums, int low, int high) {
		int mid = (low + high) >> 1;
		if (low < high) {
			//二路归并排序
			// 左边拆分
			mergeSort(nums, low, mid);
			// 右边拆分
			mergeSort(nums, mid + 1, high);
			// 左右归并
			merge(nums, low, mid, high);
		}
		return nums;
	}

	public static void merge(int[] nums, int low, int mid, int high) {
		//生成一个临时数组,用来存放排序好的数组,然后再传递给原数组
		int[] temp = new int[high - low + 1];
		int i = low;// 左指针
		int j = mid + 1;// 右指针
		//作为temp数组存放的下标
		int k = 0;

		//因为使用的是二路归并,每次都被分成两个,所以比较归并是比较左右数组,
		//把较小的数先移到新数组中
		while (i <= mid && j <= high) {
			if (nums[i] < nums[j]) {
				temp[k++] = nums[i++];
			} else {
				temp[k++] = nums[j++];
			}
		}

		// 把左边剩余的数移入数组
		while (i <= mid) {
			temp[k++] = nums[i++];
		}

		// 把右边边剩余的数移入数组
		while (j <= high) {
			temp[k++] = nums[j++];
		}

		// 把新数组中的数覆盖nums数组
		for (int m = 0; m < temp.length; m++) {
			nums[m + low] = temp[m];
		}
	}

}