听了韩顺平老师讲的课的总结笔记
归并排序(Merge-Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治的策略(分治法将问题分成一些小的问题,然后 递归求解,而治(conquer)的阶段则将分的阶段得到的各种答案“修补”在一起,即分而治之。
tmpleft的合并的顺序对应如图的7次合并
0(tmpleft),1(right) 2(tmpleft),3(right) 0(tmpleft),3(right) 4(tmpleft),5(right) 6(tmpleft),7(right) 4(tmpleft),7(right) 0(tmpleft),7(right)
package com;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class MergeSort{
public static void main(String[] args) {
int[] arr=new int[8];
for (int i = 0; i < arr.length; i++) {
arr[i]= (int) (Math.random()*8000);
}
// int[] arr={8,4,5,7,1,3,6,2};
int[] temp=new int[arr.length];
Date date=new Date( );
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
System.out.println( "排序前的时间:"+sdf.format( date ) );
// int temp[]=new int[arr.length];两个方法都可以
mergeSort( arr,0,arr.length-1,temp );
System.out.println( "归并排序后的数组"+Arrays.toString( arr ) );
Date date1=new Date();
System.out.println("排序后的时间:"+ sdf.format( date1 ) );
}
// 分的方法(用来排序)
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 );
// 分一次合并一次(合并的过程会进行相关的排序计算)
meger(arr, left,mid,right, temp);
}
}
// 合并的方法
/*
* @param arr 定义的数组
* @param left
*
* @param mid 定义的中间的索引
* @param right 定义的右边的索引
* @param temp 定义的中间的数组
* */
public static void meger(int[] arr,int left,int mid,int right,int[] temp){
int i=left;//定义左边有序序列的索引
int j=mid+1;//右边有序序列的索引
int t=0;//指向temp数组的当前的索引
// 1. 先把左右两边(有序的数据)按照规则填充到temp数组
// 直到所有的有序序列全部填充完毕
while(i<=mid&&j<=right){
if(arr[i]<=arr[j]){//填充小的
temp[t]=arr[i];
t++;
i++;
}else{
temp[t]=arr[j];
t++;
j++;
}
}
// 2. 把剩余的数据填充到temp数组
while(i<=mid){//左边剩余
temp[t]=arr[i];
t+=1;
i+=1;
}
// 右边剩余
while(j<=right){
temp[t]=arr[j];
t++;
j++;
}
t=0;//重新让t从0开始
//3.把temp数组赋值给arr数组
int tmpleft=left;//等于数组arr左边
// 最后的 tmp=7;t=7;也就是长度为8的数组被完全的赋值
System.out.println("tmpleft"+tmpleft+"\t"+"right"+right);
while(tmpleft<=right){
arr[tmpleft]=temp[t];
t++;
tmpleft++;
}
}
}