java實現歸併排序
阿新 • • 發佈:2021-02-14
歸併排序
歸併排序(Merge Sort)是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
基本原理
①申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
②設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
③比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟③直到某一指標超出序列尾,將另一序列剩下的所有元素直接複製到合併序列尾
程式碼
import java.util.Arrays;
public class MergeSort {
public static int[] sort(int[] arr, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
//歸併的實現
sort(arr, low, mid);
sort(arr, mid + 1, high);
merge(arr, low, mid, high);
}
return arr;
}
public static void merge(int[] arr1, int low, int mid, int high) {
int[] t = new int[high - low + 1];
int i = low;// 建立左指標
int j = mid + 1;// 建立右指標
int k = 0;
//逐個歸併
//先將較小的數移到新陣列中
while (i <= mid && j <= high) {
if (arr1[i] <= arr1[j]) {
t[k++] = arr1[i++];
} else {
t[k++] = arr1[j++];
}
}
//再將左邊剩餘的數移入陣列
while (i <= mid) {
t[k++] = arr1[i++];
}
//再把右邊邊剩餘的數移入陣列
while (j <= high) {
t[k++] = arr1[j++];
}
//最後讓新陣列中的數拷貝到arr陣列中
for (int k1 = 0; k1 < t.length; k1++) {
arr1[k1 + low] = t[k1];
}
}
// 歸併排序的實現
public static void main(String[] args) {
int[] arr2 = {17,8,45,-5,-92,41,19,33,-2};
System.out.println("原陣列為:" );
System.out.println(Arrays.toString(arr2));
MergeSort.sort(arr2, 0, arr2.length-1);
System.out.println("排序後的陣列為:");
System.out.println(Arrays.toString(arr2));
}
}
執行結果為: