归并排序思想及java模板代码

Posted 知道什么是码怪吗?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序思想及java模板代码相关的知识,希望对你有一定的参考价值。

 归并排序思想:

①划分:将进入方法的数组划分为两部分

②递归:递归继续划分,直到个数为1

③合并:根据值的大小来合并,小的先放入合并的数组当中。

例如:1, 1, 7, 3, 4, 5, 9, 8, 3

一直递归到底层 划分为{ 1 , 1 }  { 7 }  { 3 , 4 }  { 5 , 9 }  { 8 , 3 }

合并{ 1 , 1 , 7 }  { 3 , 4 }  { 3 , 5 , 8 , 9 }

合并{ 1 , 1 , 3 , 4 , 7  }  { 3 , 5 , 8 , 9 }

合并{ 1 , 1 , 3 , 3 , 4 , 5 , 7 , 8 , 9 }

但是程序不是这样执行的,是根据递归的顺序来合并的。

下面这个图形象生动:

归并排序模板代码(去掉注释和调试的代码也就20行左右):

package arithmetic;

//归并排序模板代码
//归并排序是稳定的
public abstract class MergeSort {
	static int[] nums = { 1, 1, 7, 3, 4, 5, 9, 8, 3 };
	static int[] result = new int[nums.length];

	public static void merge_sort(int nums[], int left, int right) {
		// 如果传过来的数组范围的两个下标的left>=right
		// 说明了这个数组的只有1个数,不需要排序
		if (left >= right)
			return;

		int mid = left + (right - left) / 2;// 防止溢出写法

		merge_sort(nums, left, mid);// 一直递归取前一半数组
		merge_sort(nums, mid + 1, right);// 前一半递归到不能再递归后对当前数组后一半递归直到只有一个数

		// 下面这一个for循环可以用来看递归是如何划分数组的
//		System.out.print("划分数组:");
//		for (int count = left; count <= right; count++) {
//			System.out.print(nums[count] + " ");
//		}
//		System.out.println();

		int Index = 0;// 结果数组的下标
		int i = left;// 左边数组的开始下标,左边是left到mid
		int j = mid + 1;// 右边数组的开始下标,右边是mid+1到right

		// 其实这里相当于每一次递归都会刷新result数组的值
		while (i <= mid && j <= right) {// 将递归的左右数组合并,谁小就先放进去
			if (nums[i] <= nums[j])
				result[Index++] = nums[i++];
			else
				result[Index++] = nums[j++];
		}

		// 当某一个数组放完后,另一个数组直接放进去
		while (i <= mid)
			result[Index++] = nums[i++];
		while (j <= right)
			result[Index++] = nums[j++];

		// 将合成的有序数组放回去,方便下次合并
		// System.out.print("合并数组:");
		for (i = left, j = 0; i <= right; i++, j++) {
			nums[i] = result[j];
			// System.out.print(result[j] + " ");//用于查看合并过后的数组
		}
		// System.out.println();

	}

	public static void main(String[] args) {

		merge_sort(nums, 0, nums.length - 1);
		System.out.print("排序结果:");
		for (int i : result) {
			System.out.print(i + " ");
		}

	}

}

以上是关于归并排序思想及java模板代码的主要内容,如果未能解决你的问题,请参考以下文章

快速排序思想及java模板代码

Java归并排序

Java归并排序

Java归并排序

手把手教你写归并排序算法 (Java代码)

数据结构图解七大排序