加载中...

归并排序

	public static void main(String[] args) {// 主函数
		int[] arr = { 9, 4, 7, 6, 8, 5, 3, 2, 1, -100 };
		int[] t = new int[arr.length];
		mergeSort(arr, 0, arr.length - 1, t);
		System.out.println(Arrays.toString(arr));
	}

	/**
	 * 归并排序 主要的思想也是分治
	 * 
	 * @param arr 需要排序的数组
	 * @param l   数组的最左下标
	 * @param r   数组的最右下标
	 * @param t   和 arr 的大小一致的辅助数组
	 */
	public static void mergeSort(int[] arr, int l, int r, int[] t) {
		if (l >= r) {// 等于的时候只有一个元素,一个元素是有序的
			return;
		}
		int mid = (l + r) / 2;
		mergeSort(arr, l, mid, t);// 左递归
		mergeSort(arr, mid + 1, r, t);// 右递归
		merge(arr, l, r, t);
	}

	/**
	 * @param arr 需要排序的数组
	 * @param l   子数组最左下标
	 * @param r   子数组最右下标
	 * @param t   和 arr 的大小一致的辅助数组
	 */
	public static void merge(int[] arr, int l, int r, int[] t) {
		int mid = (l + r) / 2;
		int tIndex = 0;// 辅助数组索引
		int lIndex = l;// 左下标索引
		int rIndex = mid + 1;// 右下标索引
		while (lIndex <= mid && rIndex <= r) {
			if (arr[lIndex] < arr[rIndex]) {
				t[tIndex++] = arr[lIndex++];
			} else {
				t[tIndex++] = arr[rIndex++];
			}
		}
		while (lIndex <= mid) {
			t[tIndex++] = arr[lIndex++];
		}
		while (rIndex <= r) {
			t[tIndex++] = arr[rIndex++];
		}
		tIndex = 0;// 辅助数组索引下标清零,准备对原排序数组 arr 进行赋值
		for (int i = l; i <= r; i++) {
			arr[i] = t[tIndex++];
		}
	}
posted @ 2023-03-03 14:53  ChuenSan  阅读(13)  评论(0编辑  收藏  举报