錯誤原因:
Exception in thread “main” java.lang.StackOverflowError(歸併排序棧溢出異常)
原因是我的遞歸沒有寫結束條件,那現在我們要寫一個結束,那什麼時候寫結束條件呢?就是當只有一個數字的時候,我們就不需要再遞歸了。什麼情況下只有一個數字,當左邊這個數字不小於右邊這個數字,左邊的數字有可能等於或者大於右邊的時候,即low>=high的時候,我們就不需要在遞歸了。
解決方法:
設置結束條件,如下圖所示:
原碼展示:
package demo4;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{1,3,5,2,4,6,8,10};
System.out.println(Arrays.toString(arr));
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int low,int high){
int middle = (high+low)/2;
if(low<high){
//處理左邊
mergeSort(arr,low,middle);
//處理右邊
mergeSort(arr,middle+1,high);
//歸併
merge(arr,low,middle,high);
}
}
//歸併排序
public static void merge(int[] arr, int low, int middle, int high){
//用於存儲歸併後的臨時數組
int[] temp = new int[high-low+1];
//記錄第一個數組中需要遍歷的下標
int i=low;
//記錄第二個數組中需要遍歷的下標
int j=middle+1;
//用於記錄在臨時數組中存放的下標
int index=0;
//遍歷兩個數組取出小的數字,放入臨時數組中
while(i<=middle&&j<=high){
//第一個數組的數據更小
if(arr[i]<=arr[j]){
//把小的數據放入臨時數組中
temp[index]=arr[i];
//讓下標向後移一位
i++;
}else{
temp[index]=arr[j];
j++;
}
index++;
}
//處理多餘的數據
while(i<=middle){
temp[index]=arr[i];
i++;
index++;
}
while(j<=high){
temp[index]=arr[j];
j++;
index++;
}
//把臨時數組中的數據重新存入原數組
for(int k=0; k<temp.length;k++){
arr[k+low]=temp[k];
}
}
}