八大排序之——归并排序(五)

概述

归并排序:
思想:

  1. 若将两个有序表合并成一个有序表,称为二路归并,所以叫做归并排序。
  2. 使用递归,不断将两个有序表合成为一个有序表
    实现:
  3. 使用递归将两个有序数组合为一个有序数组

归并排序是先递归再排序
快速排序是先排序再递归

图示

这个图示真的不错
归并排序

代码



import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 归并排序
 * @author 楠
 *
 */
public class mergeSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = new int[30000000];
		for (int i = 0; i < 30000000; i++) {
			arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
		}
		System.out.println("排序前");
		Date data1 = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date1Str = simpleDateFormat.format(data1);
		System.out.println("排序前的时间是=" + date1Str);
		
		long startMili=System.currentTimeMillis();
		System.out.println("开始         "+startMili);
		
		int temp[] = new int[arr.length]; //归并排序需要一个额外空间
 		mergeAll(arr, 0, arr.length - 1, temp);
		
		long endMili = System.currentTimeMillis();
		System.out.println("开始         " + (endMili - startMili));
		
 		
 		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2);
		System.out.println("排序前的时间是=" + date2Str);
	}
	//分+治
	public static void mergeAll(int[] arr,int left,int right,int[] temp) {
		if(left<right) {
			int mid=(left+right)/2;
			//左
			mergeAll(arr, left, mid, temp);
			//右
			mergeAll(arr, mid+1, right, temp);
			//治
			merge(arr, left, mid, right, temp);
		}
	}
	//分
	public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
		int a=left;
		int b=mid+1;
		int pointer=0;
		//一、比较,赋值给temp
		while (a<=mid&&b<=right) {
			if(arr[a]>arr[b]) {
				temp[pointer]=arr[b];
				b++;
				pointer++;			
			}else {
				temp[pointer]=arr[a];
				a++;
				pointer++;
			}
		}
		//二、将左右剩余的数列赋值给temp
		while (a<=mid) {
			temp[pointer]=arr[a];
			a++;
			pointer++;
		}
		while (b<=right) {
			temp[pointer]=arr[b];
			b++;
			pointer++;
		}
		//三、将temp赋值给arr
		for(int i=0;i<pointer;i++) {
			arr[left]=temp[i];
			left++;
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值