Java算法系列篇 【并归排序】

什么? 搞Java不会算法? 

由于个人兴趣原因以及工作所需,最近了解Java算法的相关案例

及时分享 感兴趣的欢迎交流

并归排序

描述:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列
分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

展示

如果还是不明白 请看图

并归排序

动图展示

并归排序动图

代码浏览

因为我分开方法写的, 代码较多 一张图截不下来,所以分开图①图②

代码①

并归排序1

代码②

并归排序2

代码自测

public static void main(String[] args) {
	// 无序数组
	int[] arr = {1, 8, 2, 6, 7, 3, 9};
	JavaAlgorithm2 javaAlgorithm2 = new JavaAlgorithm2();
	//并归排序
	javaAlgorithm2.mergeSort(arr);
}
/**
 * 并归排序
 * [@param](https://my.oschina.net/u/2303379) arr 待排序数组
 */
private void mergeSort(int[] arr) {
	JavaAlgorithm2.sort(arr, 0, arr.length - 1);
	//展示排序结果
	System.out.println("排序后:"+Arrays.toString(arr));
}

/**
 * 排序
 * [@param](https://my.oschina.net/u/2303379) arr
 * [@param](https://my.oschina.net/u/2303379) left
 * [@param](https://my.oschina.net/u/2303379) right
 */
private static void sort(int[] arr, int left, int right) {
	if (left >= right)
		return;
	//找出中间索引
	int center = (left + right) / 2;
	//	对左边数组进行递归
	sort(arr, left, center);
	//	对右边数组进行递归
	sort(arr, center + 1, right);
	//	合并
	merge(arr, left, center, right);
}

/**
 * 合并
 * [@param](https://my.oschina.net/u/2303379) data 数组对象
 * @param left  左数组的第一个元素的索引
 * @param center 左数组的最后一个元素的索引,center+1 是右数组第一个元素的索引
 * @param right  右数组最后一个元素的索引
 */
private static void merge(int[] data, int left, int center, int right) {
	//	临时数组
	int[] tempArr = new int[data.length];
	//	右数组第一个元素索引
	int mid = center + 1;
	//	third 纪录临时数组的索引
	int third = left;
	//	缓存左数组第一个元素的索引
	int tmp = left;
	while (left <= center && mid <= right) {
		//	从两个数组中取出最小的放入临时数组
		if (data[left] <= data[mid]) {
			tempArr[third++] = data[left++];
		} else {
			tempArr[third++] = data[mid++];
		}
	}
	//	剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
	while (mid <= right) {
		tempArr[third++] = data[mid++];
	}
	while (left <= center) {
		tempArr[third++] = data[left++];
	}
	//	将临时数组中的内容拷贝回原数组中
	//(原left-right范围的内容被复制回原数组)
	while (tmp <= right) {
		data[tmp] = tempArr[tmp++];
	}
	//System.out.println(Arrays.toString(data));
}

代码稍微比别的排序多一点点,但是并归排序很容易理解,多结合看几遍动图和代码

初期可以拿去自己练习 熟悉之后可以灵活运用


希望同仁志士,前来参考以及指点!共同进步,发扬文化精神!转载请标明出处!

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Java算法系列篇