java归并排序

java归并排序

  • java排序算法的一种,时间复杂度为nlog2n。效率较高。

  • 1.数据分割阶段。将数据分成两份,之后递归再分成两份,直到每份只有一个数据,如下图:
    图片来自尚硅谷课堂

  • 2.治理数据阶段。将每一组排序的数据按照一个规则排序,存放在临时数组temp中

下图按照最后一步治理数据为例,起始分开之后的每一步数据治理都可使用这套规则。所以可以分装好,放入排序方法中,等待递归。
在这里插入图片描述

  • 具体代码实现
package sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MergeSort {

	public static void main(String[] args) {
//		int[] arr = {-8,422,42,6,-12,90};
	
//		System.out.println(Arrays.toString(arr));
//		mergeSort(arr, 0, arr.length-1,temp);
//		System.out.println(Arrays.toString(arr));
		int[] arr = new int[800000];
		for (int i = 0; i < arr.length; i++) {
			arr[i] =(int)(Math.random()*8000);
		}
		int[] temp =new int[arr.length];
	
		Date date1 = new Date();
		
		SimpleDateFormat simpleDateFormat= new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
		String dateString1 = simpleDateFormat.format(date1);
		System.out.println(dateString1);
		
		mergeSort(arr, 0, arr.length-1,temp);
		Date date2 = new Date();
		String dateString2 = simpleDateFormat.format(date2);
		System.out.println(dateString2);
	}
	/**
	 * 
	 * @param a 数组
	 * @param left 左坐标
	 * @param right 又坐标
	 * @param temp 临时数组
	 */
	public static void mergeSort(int[] a,int left ,int right,int[] temp) {
		if(left<right) {
			int midIndex = (left+right)/2;
			//向左递归分解
			mergeSort(a, left, midIndex, temp);
			//向右递归分解
			mergeSort(a, midIndex+1, right, temp);
			
			merge(a, left, midIndex, right, temp);
		}
	}
	//封装好的治理归并函数,适用于每一层递归
	public static void merge(int[] a,int left ,int mid,int right,int[] temp) {
		//1.将某一边的数据排列进入temp
		int i = left;
		int j = mid +1;
		int t= 0;
		while(i<= mid && j<=right) {
			if(a[j]<=a[i]) {
				temp[t] = a[j];
				t+=1;
				j++;
			}else {
				temp[t] = a[i];
				t++;
				i++;
			}
		}
		
		//2将另一边的剩余的数据全部加入temp中
		while(i<=mid) {
			temp[t] = a[i];
			t++;
			i++;
		}
		while(j<=right) {
			temp[t] = a[j];
			t++;
			j++;
		}
		
		//2将在temp中排序号的数据复制到a数组中
		int tempLeft = left;
		t= 0;//从头开始
		while(tempLeft <= right) {
			a[tempLeft] = temp[t];
			t++;
			tempLeft++;
		}
		
	}
}

在随机生成的80000个数据,使用时间

2019-08-13 11:57:14 971
2019-08-13 11:57:15 202

使用了231ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值