一. 先上代码
public class guibing {
public static void main(String[] args) {
int a[]={1,83,5,17,2,4,26,9,6,1,16,6};
int[] temp = new int[a.length];
guibing.sort(a,0,a.length-1,temp);
for (int i = 0; i < temp.length; i++) {
int i1 = temp[i];
System.out.println(i1);
}
}
public static void sort(int arr[],int left, int right, int[] temp){
if(left < right) {
int mid =(left+right)/2;
sort(arr, left, mid, temp); //左边的排序
sort(arr,mid+1, right, temp); //右边的排序
merge(arr, left, mid, right, temp); //将排好的进行合并
}
}
/**
*
* @param arr
* @param left
* @param mid
* @param right
* @param temp
* @return
*/
public static void merge(int arr[], int left, int mid, int right, int[] temp){
int i=left;
int j=mid+1;
int al=mid+1;
int bl=right+1;
for (int k=0; k< right+1; k++){
if(i>mid && j>right)
break;
// 判断这两个数组是否有已经遍历完的
if(i >=al && j<bl){
temp[k] = arr[j];
j++;
continue;
}
if(j >=bl && i<al){
temp[k] = arr[i];
i++;
continue;
}
//进行比较
if(arr[i]>arr[j]){
temp[k]=arr[j];
j++;
continue;
}else {
temp[k]=arr[i];
i++;
continue;
}
}
// 将 temp的拷贝arr中
int t=0;
while(left<= right){
arr[left++] =temp[t++];
}
}
}
2.归并排序,主要思路就是
我先拆,拆成最基本的,然后回头再排序,让左边和右边有序的数组继续排序。
直接 用https://www.cnblogs.com/chengxiao/p/6194356.html的图片
正如代码中
2.1merge()方法进行的比较,将数组排序;
2.2sort()的功能是拆 与 和,主要是用于安排多次merge 方法调用的正确顺序;
这个时候就需要用递归实现,因为最基本的就是先拆成一个,然后左一和右一排序,拍完后左二和右二继续排,以此类推调用merge(); 递归的判断点就在于 (right>left) 。