什么是分治?
分治法将问题分成一些小的问题然后递归求解,治就是一个合的思想。
归并排序代码思路:
分其实就是把一个数组从中间分成两个数组,左数组和右数组,分界点为mid=left+right/2,然后递归,最后得到上图所示蓝色字体的最后一行一个个单独的数组
治(合并)就是要求两个分好的数组进行按照一定规则的排序,这时我们使用三个指针来完成其操作,第一个left(i)指针是指向左数组的首节点,第二个指针mid+1(j)指向右数组的首节点,第三个指针temp[0](t)指向新建数组的首节点
归并排序代码:
import java.util.Arrays;
public class GuibingMergesort {
public static void main(String[] args) {
int arr[] = { 8, 4, 5, 7, 1, 3, 6, 2 };
int temp[] = new int[arr.length]; // 归并排序需要一个额外空间
mergeSort(arr, 0, arr.length - 1, temp);
System.out.println("归并排序后=" + Arrays.toString(arr));
}
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){
System.out.println("xxx");
int i=left;//左边有序序列的索引
int j=mid+1;//右边有序序列的索引
int t=0;//temp数组的索引
//(一)
//首先比较左右两边(有序)的数据按照规则现充到temp数组中
//直到左右两边有序序列有一方处理完毕为止
while (i<=mid && j<=right){//继续
if (arr[i]<=arr[j]){
temp[t]=arr[i];
t=t+1;
i=i+1;
}else{//反之
temp[t]=arr[j];
j=j+1;
t=t+1;
}
}
//(二)
//当有一方处理完毕的时候
//把另一方的剩余的全部数据依次填充到temp数组中
while (i<=mid){//这时j的指针大于right,表示右边的数组已经全部处理完毕
temp[t]=arr[i];
t=t+1;
i=i+1;
}
while(j<=right){//这时i的指针大于mid,表示左边的数组已经处理完毕
temp[t]=arr[j];
j=j+1;
t=t+1;
}
//(三)
//把temp数组的元素拷贝到arr数组
//注意,并不是每次都拷贝
System.out.println("left= "+left+" right= "+right);
int tempLeft=left;
t=0;
while (tempLeft<=right){
arr[tempLeft]=temp[t];
t+=1;
tempLeft+=1;
}
}
}