标签:oid port 归并 完成 数组 main ges 左右 from
/*
* 归并排序思路:
* 1.将一个数列 先分后治
* 先对半分,数列对半分,分到最后一个,然后在两两治,合并成一个有序列
* 在从2个有序列合并一个有序,知道合并完成
*
* */
import java.util.Arrays;
public class MergetSort {
public static void main(String[] args) {
int []arr = {7,5,68,1,4,0};
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){
int i = left;//左边有序的初始索引
int j = mid;//右边有序的初始索引
int t = 0;//指向temp数组的当前索引
//(一)将左右2个有序放到temp中
//直到有一边数列处理完
while(i <= mid && j <=right){
//如果左边有序当前元素 小于 右边有序当前元素
//将左边当前拷到temp
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t += 1;
i += 1;
}else{//反之,将右边的当前元素拷贝到temp
temp[t] = arr[j];
t += 1;
j += 1;
}
}
//(二)把有剩余的放回到temp
while (i <= mid){
temp[t] = arr[i];
t += 1;
i += 1;
}
while (j <= right){
temp[t] = arr[j];
t += 1;
j += 1;
}
//(三)将temp数组拷arr\
// 注意不是每一次都拷贝
t = 0 ;
int tempLeft = left;
while (tempLeft <= right){
arr[tempLeft] = temp[t];
t += 1;
tempLeft += 1;
}
}
}
code from ----梁氏
标签:oid port 归并 完成 数组 main ges 左右 from
原文地址:https://www.cnblogs.com/liang-shi/p/13763066.html