java归并排序

package com.zz.sort;

import java.util.Random;

public class MergeSortZZ {
	public static void main(String[] args) {
		//int[] iArrgs = new int[] { 10, 3, 18, 3, 5, 8, 16, 4, 2 };
		int iLength = 5000;
		int[] iArgs = new int[iLength];
		for (int i = 0; i < iLength; i++) {
			Random objRandom = new Random();
			iArgs[i] = objRandom.nextInt(10000);
		}
		mergeSort(iArgs, new int[iArgs.length], 0, iArgs.length - 1);  
		 for(int i = 0; i < iArgs.length; i++ ) {
			 System.out.print(iArgs[i] + " " );
		 }
	}
	/**
	 * 把一个大数组分成两个数组
	 * 
	 * @param iArrgs 排序数组
	 * @param tempArrgs 临时数组
	 * @param left 排序数组左下标
	 * @param right 排序数组右下标
	 */
	private static void mergeSort(int[] iArrgs, int[] tempArrgs, int left, int right) {
		if(left < right) {
			int iMiddle =  ( left + right ) / 2;
				
			//左边切分数组
			 mergeSort(iArrgs, tempArrgs, left, iMiddle) ;
			//右边切分数组
			 mergeSort(iArrgs, tempArrgs, iMiddle + 1, right) ;
			 //排序
			 merge(iArrgs, tempArrgs,left,iMiddle + 1,right);
		}
	}
	
	
	/**
	 * 把两个数组按照从小到大的顺序排序
	 * 
	 * @param iArrgs 排序数组
	 * @param tempArrgs 临时数组
	 * @param left 排序数组左下标
	 * @param middle 排序数组中间位置 
	 * @param right 排序数组右下标
	 */
	private static void merge(int[] iArrgs, int[] tempArrgs, int left,int middle, int right) {
		//左数组末尾下标
		int leftEnd = middle -1;
		//右数组开始下标
		int rightStart = middle;
		//临时数组下标
		int tempIndex = left;
		//数组的长度
		int length = right - left + 1;
		//两个数组比较大小
		while(left <= leftEnd && rightStart <= right) {
			//值小的放入临时数组
			if (iArrgs[left] < iArrgs[rightStart]) {
				tempArrgs[tempIndex++] = iArrgs[left++];
			} else {
				tempArrgs[tempIndex++] = iArrgs[rightStart++];
			}
		}
		//如果进入下面循环,表示他们在临时数组的中是最大的。
		while(left <= leftEnd ) {
			tempArrgs[tempIndex++] = iArrgs[left++];
		}
		
		//如果进入下面循环,表示他们在临时数组的中是最大的。
		while(rightStart <= right) {
			tempArrgs[tempIndex++] = iArrgs[rightStart++];
		}
		
		for (int i = right; i >= 0; i--) {
			//临时数组里面的
			iArrgs[i] = tempArrgs[i];
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值