归并排序---java实现

1、归并排序(Merging Sort)

“归并的含义是将两个或者两个以上的有序表组合成一个新的有序表”。无论是顺序存储结构还是链表存储结构,够可在O(m+n)的时间量级上实现(书中概念) 。换言之,就是将两个有序表合并成一个。

2、一种简单的归并排序实现

    ① 首先将待排序列有序的化分为若干子序列(假设是升序排序,则按照升序划分)

    ②两两归并,直至合并成一个序列

eg:

一个简单的例子

3、java实现(非递归)

仅供参考

public class MergeSortTest {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int[] array = {49,38,65,97,76,13,27};
		mergeSortDemo(array);
		for(int x:array)
			System.out.print(x + " ");
	}
	public static void mergeSortDemo(int[] array) {
		int start1 = 0,start2 = 0,end1 = array.length-1,end2 = array.length-1;
		//1、确定第一个子序列结束的位置
		for(int i = 1; end1 < array.length;i++) {
			if(array[i] < array[i-1]) {
				end1 = i-1;
				break;
			}	
		}
		while(end1 != array.length-1) {
			//1、确定第二个子序列结束的位置
			end2 = array.length-1;
			for(int i = end1+1;i<array.length-1;i++) {
				if(array[i] > array[i+1]) {
					end2 = i;
					break;
				}
			}
			start2 = end1+1;//第二个子序列开始的位置  是 第一个子序列结束位置的下一个
			merge(array,start1,end1,start2,end2);
			end1 = end2;//下一次归并:第一个子序列 结束的位置 是上一次归并中第二个子序列结束的位置
		}
	}
	//归并
	public static void merge(int[] array,int start1,int end1,int start2,int end2) {
		//将两个有序合并为一个
		int[] array1 = new int[end2+1];//创建一个信息数组
		for(int i = 0; i <= end1;i++)//将第一个数组赋值给array1
			array1[i] = array[i];
		//将第二个数组插入到array1中
		int index = 0;//第一次开始比较的地方
		for(int i = start2;i <= end2;i++) {
			boolean b = false;//设置当前元素是否插入
			for(int j = index;j <= end1;j++) {
				if(array1[j] > array[i]) {
					b = true;
					//从j开始 到end1向后移动
					for(int k = end1;k >= j;k--) 
						array1[k+1] = array1[k];
					array1[j] = array[i]; 
					index = j;//下一次开始比较的位置,因为是有序表  因此下一个元素插入时 不需要从头开始比较
					end1++;//数组1后移一个位置
					break;
				}
			}
			//判断是否插入,如果没插入 那么直接将未插入的数与当前array1数组合并 并退出循环
			if(b == false) {
				for(int k = i;k<=end2;k++)
					array1[k] = array[k];
				break;
			}
		}
		//将array1赋值给array
		for(int i = 0;i < array1.length;i++) {
			array[i] = array1[i];
		}
	}
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值