概述
归并排序:
思想:
- 若将两个有序表合并成一个有序表,称为二路归并,所以叫做归并排序。
- 使用递归,不断将两个有序表合成为一个有序表
实现: - 使用递归将两个有序数组合为一个有序数组
归并排序是先递归再排序
快速排序是先排序再递归
图示
这个图示真的不错
归并排序
代码
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++;
}
}
}