归并排序(merge sort)——数据结构与算法复习

本文介绍了一种高效的排序算法——归并排序,并通过Java代码实现了泛型数组的排序。该算法采用分治策略,将数组分为两半分别排序后再合并。

因为校园招聘马上要开始 了,所以马上来温习一下 数据结构与算法的内容,今天为大家带来我刚写的还带有余温的归并排序——merge sort。

废话不说,代码端上(用java实现的泛型数组排序):

package kevin.sort;

import java.util.Arrays;

public class SortInPaper {

	/**
	 * 用归并排序的方法对一个数组进行排序,输出有序数组
	 * @param <T> 数组元素的类型,这个类型应该实现Comparable接口,因为merge sort是基于比较的
	 * 			     排序算法。当然我们也可以在方法的参数列表中添加一个Comparator类型的参数,由用
	 * 			     户自定义排序(比较)的依据或方式 
	 * @param a   被排序的数组
	 * @param beg 被排序的范围的开始
	 * @param end 被排序的范围的结束
	 */
	public static <T extends Comparable<? super T>> void mergeSort(T[] a,
			int beg, int end) {
		if (beg < end) {
			int mid = (beg + end) / 2; //划分点
			mergeSort(a, beg, mid);   //对左半部分进行排序
			mergeSort(a, mid + 1, end); //对右半部分进行排序
			merge(a, beg, mid, end);  //合并子问题的结果
		}
	}

	/**
	 * 对一个数组 的两个有序部分进行排序
	 * @param <T> 数组元素的类型
	 * @param a 要进行排序的数组
	 * @param beg 左半部分第一个元素的索引
	 * @param mid 左半部分最后一个元素的索引,同时也是右半部分第一个元素左边相邻的元素
	 * @param end 右半部分最后一个元素的索引 
	 */
	private static <T extends Comparable<? super T>> void merge(T[] a, int beg,
			int mid, int end) {
		T[] left = Arrays.copyOfRange(a, beg, mid + 1); //左半部分的数组元素的copy
		T[] right = Arrays.copyOfRange(a, mid + 1, end + 1); //右半部分的数组元素的copy

		int i = 0;
		int j = 0;
		int k = beg;  //用来跟踪a中的元素
		//先把较小的元素copy到a中,依次递推
		while (i < left.length && j < right.length) {
			if (left[i].compareTo(right[j]) > 0) { 
				a[k++] = right[j++];
			} else {
				a[k++] = left[i++];
			}
		}

		//可能左右两个数组中还有元素没有被复制到a中,所以把剩下的元素复制过去 
		if (i < left.length) {
			while (i < left.length) {
				a[k++] = left[i++];
			}
		} else if (j < right.length) {
			while (j < right.length) {
				a[k++] = right[j++];
			}
		}
	}
}

还请大家指教,看有什么地方 还需要修改的。。thx~~~吐舌头大笑微笑~~


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值