歸併排序java示例
阿新 • • 發佈:2018-12-20
歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法採用分治法的思想。分:將待排序序列拆分成一個個子序列。治:將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。
可以採用遞迴的方式將待排序序列拆分,然後進行歸併操作。
歸併操作的工作原理如下: 第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列。 第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置。 第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置。 重複步驟三,直到某一指標超出序列尾。 將另一序列剩下的所有元素直接複製到合併序列尾。
java示例:
public class MergeSort { public static void main(String[] args) { int[] arr = {1,3,2,6,4,66,32,65,34,67,45,67,78,34,56}; System.out.println("排序前:"); System.out.println(Arrays.toString(arr)); sort(arr); System.out.println("排序後:"); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr) { sort(arr, 0, arr.length - 1); } public static void sort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right)/2; sort(arr, left, mid);//左邊歸併排序 sort(arr, mid + 1, right);//右邊歸併排序 merge(arr, left, mid, right);//將兩個有序子數組合並處理 } } private static void merge(int[] arr, int left, int mid, int right) { int i = left; int j = mid + 1; int t = 0; int[] temp = new int[right - left + 1];//定義臨時資料,長度為兩個子陣列之和 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[t++] = arr[i++]; } else { temp[t++] = arr[j++]; } } while (i <= mid) {//左邊剩餘元素放到臨時數組裡 temp[t++] = arr[i++]; } while (j <= right) {//右邊剩餘元素放到臨時數組裡 temp[t++] = arr[j++]; } t = 0; while (left <= right) {//將臨時陣列中的元素全部拷貝到原陣列中 arr[left++] = temp[t++]; } } }
執行結果:
排序前:
[1, 3, 2, 6, 4, 66, 32, 65, 34, 67, 45, 67, 78, 34, 56]
排序後:
[1, 2, 3, 4, 6, 32, 34, 34, 45, 56, 65, 66, 67, 67, 78]
Process finished with exit code 0