java记录 - 归并排序

归并排序

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

public class MergetSort {

	public static void main(String[] args) {

		// 创建要给 80000 个的随机的数组
		int[] arr = new int[80000000];
		for (int i = 0; i < 80000000; 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);

		int temp[] = new int[arr.length]; //归并排序需要一个额外空间
		
		mergeSort(arr, 0, arr.length - 1, temp);//八千万数据15秒

		Date data2 = new Date();
		String date2Str = simpleDateFormat.format(data2); 
		System.out.println("排序前的时间是=" + date2Str);

	}

	//分+合方法
	public static void mergeSort(int[] arr, int left, int right, int[] temp) {

		if(left < right) {
			int mid = (left + right) / 2; //中间索引
			//向左递归进行分解
			mergeSort(arr, left, mid, temp);
			// 向 右 递 归 进 行 分 解 
			mergeSort(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 i = left; 
		int j = mid + 1; 
		int t = 0; //  指向 temp 数组的当前索引

		while (i <= mid && j <= right) {

			if(arr[i] <= arr[j]) {
				temp[t] = arr[i]; 
				t += 1;
				i += 1;
			} else { //反之,将右边有序序列的当前元素,填充到 temp 数组
				temp[t] = arr[j]; 
				t += 1;
				j += 1;
			}
		}

		while( i <= mid) { //左边的有序序列还有剩余的元素,就全部填充到 temp 
			temp[t] = arr[i];
			t += 1;
			i += 1;

		}

		while( j <= right) { //右边的有序序列还有剩余的元素,就全部填充到 temp 
			temp[t] = arr[j];
			t += 1;
			j += 1;

		}

		t = 0;
		int tempLeft = left; //

		while(tempLeft <= right) {
			arr[tempLeft] = temp[t];
			t += 1;
			tempLeft += 1;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/bell_love/article/details/106319739