归并排序

package graph;

public class Main {
	public void 非递归归并排序(int[] arr){
		int tmpIndex,leftMin,leftMax,rightMin,rightMax;
		int[] tempArr = new int[arr.length];
		//i为步长:1,2,4,8...
		for(int i=1;i<arr.length;i*=2){
			//按步长对每两个分组进行合并
			for(leftMin=0;leftMin<arr.length-i;leftMin=rightMax){
				tmpIndex = 0;
				leftMax = rightMin= leftMin+i;
				rightMax = rightMin+i;
				if(rightMax > arr.length){
					rightMax = arr.length;
				}
				while(leftMin<leftMax&&rightMin<rightMax){
					if(arr[leftMin] < arr[rightMin]){
						tempArr[tmpIndex++] = arr[leftMin++];
					}else{
						tempArr[tmpIndex++] = arr[rightMin++];
					}
				}
				//若右边挑选完并加入到tempArr中了,把左边没挑选完了搬到右边的末尾
				while(leftMin<leftMax){
					arr[--rightMin] = arr[--leftMax];
				}
				//将排好序的tempArr覆盖回原数组
				while(tmpIndex > 0){
					arr[--rightMin] = tempArr[--tmpIndex];
				}
			}
		}
		
	}
	public void 归并排序(int start, int end, int[] arr) {
		if (start < end) {
			int mid = (end + start) / 2;
			//分治策略,整个数组一分为二,分到1个元素为止
			归并排序(start, mid, arr);
			归并排序(mid + 1, end, arr);
			//一半一半再一半地入栈,合并时弹栈合并回去
			归并合并(arr, start, end);
		}
	}

	private void 归并合并(int[] arr, int start, int end) {
		int[] tempArr = new int[end - start + 1];
		int k = 0;
		int tempStart = start;
		int mid = (start + end) / 2;
		int tempEnd = mid + 1;
		while (tempStart <= mid && tempEnd <= end) {
			if (arr[tempStart] < arr[tempEnd]) {
				tempArr[k++] = arr[tempStart++];
			} else {
				tempArr[k++] = arr[tempEnd++];
			}
		}
		while (tempStart <= mid) {
			tempArr[k++] = arr[tempStart++];
		}
		while (tempEnd <= end) {
			tempArr[k++] = arr[tempEnd++];
		}
		for(int i=0;i<tempArr.length;i++){
			arr[i+start] = tempArr[i];
		}
	}
	public static void main(String[] args) {
		Main m = new Main();
		int[] arr = {5,3,1,2,4};
		m.非递归归并排序(arr);
		System.out.println();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值