package suanfa;
import java.util.Arrays;
public class Guibing {
public static void guibing(int[] arr,int left,int right) {
if(left<right) {
// int mid =arr.length/2;这样写不可以,是错的
int mid = (left+right)/2;
//划分左半区
guibing(arr,left,mid);
//划分右半区
guibing(arr,mid+1,right);
//合并
hebing(arr,left,mid,right);
}
}
//合并
public static void hebing(int[] arr,int left,int mid,int right) {
//定义一个辅助数组
int[] brr = new int[arr.length];//中括号里写几就是几个元素。
// int[] brr = new int[right-left+1];
int i = left;//标记左半区第一个未排序的元素
int j = mid +1;//标记右半区第一个未排序的元素
int index=0;//定义辅助数组索引
//合并元素
while(i<=mid&&j<=right) {
if(arr[i]<arr[j]) {
brr[index++] = arr[i++];
// index++;
// i++;
}else {
brr[index++] = arr[j++];
// index++;
// j++;
}
}
//合并左半区剩余元素
while(i<=mid) {
brr[index++] = arr[i++];
// index++;
// i++;
}
//合并右半区剩余元素
while(j<=right) {
brr[index++] = arr[j++];
// index++;
// j++;
}
//把辅助数组的值赋给原数组
// while(left<=right) {
// arr[left]=brr[left];
// left++;
// }
// for(int a=0;a<brr.length;a++) {
// arr[a]=brr[a];
// }
//上面注释的两种赋值是我的错误理解,我以为是最终赋值给arr数组,但是其实这是每次合并时的局部排序。
//我也刚接触,先记住下面的实现方法再说。抱歉!
index=0;
while(left<=right) {
arr[left++]=brr[index++];
}
}
public static void main(String[] args) {
int[] arr = {6,3,4,2,7,8,5,1,10,9};
guibing(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
网上截图,有点模糊。我写的也是从b站学的,我的老师说他这样写对内存不好。数据上到十几万就不太好了。