java排序演算法(四)------歸併排序
阿新 • • 發佈:2018-12-11
歸併排序: 是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
合併相鄰有序子序列 程式碼實現:
public class MergeSort {
public static void sort(int[] arr) {
int[] temp = new int[arr.length];
sort(arr,0,arr.length - 1,temp);
}
public static void sort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
// 找出中間索引
int mid = (right + left)/2;
// 對左邊陣列進行遞迴
sort(arr,left,mid,temp);
// 對右邊陣列進行遞迴
sort(arr,mid+1,right,temp);
// 合併
merge(arr, left, mid, right, temp);
}
}
/**
* 將兩個陣列進行歸併,歸併前面2個數組已有序,歸併後依然有序
*
* @param arr 陣列物件
* @param left 左陣列的第一個元素的索引
* @param mid 左陣列的最後一個元素的索引,center+1是右陣列第一個元素的索引
* @param right 右陣列最後一個元素的索引
*/
private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left; //右指標
int j = mid + 1; //左指標
int t = 0; //臨時陣列指標
while (i <= mid && j <= right) {
// 從兩個陣列中取出最小的放入臨時陣列
if (arr[i] <= arr[j]) {
temp[t++] = arr[i++];
}else{
temp[t++] = arr[j++];
}
}
// 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中一個)
while (i <= mid) {
temp[t++] = arr[i++];
}
while (j <= right) {
temp[t++] = arr[j++];
}
t = 0;
// 將臨時陣列中的內容拷貝回原陣列中
// (原left-right範圍的內容被複制回原陣列)
while(left <= right){
arr[left++] = temp[t++];
}
}
}