歸併排序
歸併排序是利用歸併的思想實現的排序方法,該算法採用經典的分治策略(分治法將問題分成一些小的問題然後遞歸求解,而治的階段則將分的階段得到的個答案修補在一起,即分而治之)
簡單圖解
再來看看治階段,我們需要將連個已經有序的子序列合併成一個有序序列
合併相鄰有序子序列示意圖(最後一次合併的示意圖)
代碼如下
//分+合的方法
public static void mergeSort(int [] arr,int left,int right,int [] temp){
if(left < right){
int mid = (left + right) / 2;
//需要注意向左和向右的left/right的條件
mergeSort(arr,left,mid,temp);//左遞歸分解
mergeSort(arr,mid,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;//初始化i,左邊有序序列的初始索引
int j = mid + 1;//初始化j,右邊有序序列的初始索引
int t = 0;//指向temp數組的當前索引
//將左右兩端有序序列填充到temp中,直到一端添加完畢
while(i <= mid && j<= right){
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t++;
i++;
}else{
temp[t] = arr[j];
t++;
i++;
}
}
//把剩餘數據的一邊的數據依次填充到temp
while(i <= mid){
temp[t] = arr[i];
i++;
t++;
}
while(j <= right){
temp[t] = arr[j];
j++;
t++;
}
//將temp數組數據拷貝到原始數組中
t= 0;
int tempLeft = left;
while(tempLeft < right){
arr[tempLeft] = arr[t];
t++;
tempLeft++;
}
}
建議Debug跟代碼,更容易理解起來,遞歸還是稍微有點不好理解的