北京時間2022年03月13日,晚19:18分。天氣晴朗,多雲,溫度28。現在來實現JAVA歸並排序,歸並的核心思想是自頂向上排序,先划分到不可划分的時候排序(兩個元素時),然后逐漸退回上一層遞歸...因此,思路為:
(一)、先遞歸把元素分解為不可再分解
(二)、對(一)中的兩個元素排序
(三)、完成(二)后,退回上一層遞歸...
(四)、代碼實現:
public static void main(String[] args){
int[] array = {4,5,0,1,2,-1,-99};
MergeSort(array,0,array.length-1);
// sort(array,0,array.length-1,2);
print(array,"結果");
}
public static void MergeSort(int[] array,int left,int right){
// 首先分解元素
System.out.println("left="+left+",right="+right);
if (left>=right){
return;
}
int mid =(right+left)/2;
MergeSort(array,left,mid);
MergeSort(array,mid+1,right);
// 分解到不可分解的時候就退回到這里,既left和right加起來就只有兩個元素
sort(array,left,right,mid);
}
/**
*
* @param start
* @param end array.length
* mid 指定mid前的數是有序的,mid后的也是有序的
*/
public static void sort(int[] array,int start,int end,int mid){
// 已array={4,5,0,1,2}為例,mid=4+0/2=2
int size = array.length;
int left = start;
int right = mid+1;
int[] newArray = new int[end-start+1];
// 所以while循環遍歷
int k=0;
System.out.println("start="+start+",end="+end);
while (left<=mid && right<=end){
if (array[left]>array[right]){
System.out.println("k="+k+",left="+left+",right="+right);
newArray[k++] = array[right++];
}else if (array[left]<array[right]){
newArray[k++] = array[left++];
}
}
// 把剩下的元素填充到newArray,如{4,5,0,1,2},mid=2,newArray只填充了012
while (left<=mid){
newArray[k++]=array[left++];
}
while (right<=end){
newArray[k++]=array[right++];
}
// 最后用newArray元素覆蓋array
for (int i=0;i<newArray.length;i++){
// 因為這是遞歸進來的,所以下標是從start+i開始
array[start+i] = newArray[i];
}
}
public static void print(int[] array,String str){
System.out.println(str);
for (int i:array){
System.out.print(i+" ");
}
System.out.println();
}