HMS Core AR Engine 2D圖片/3D物體跟蹤技術 助力打造更智慧AR互動體驗
阿新 • • 發佈:2022-05-25
歸併排序介紹
歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer) 策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
歸併排序思想示意圖 1-基本思想:
歸併排序思想示意圖 2-合併相鄰有序子序列:
再來看看治階段,我們需要將兩個已經有序的子序列合併成一個有序序列,比如上圖中的最後一次合併,要將
[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合併為最終序列[1,2,3,4,5,6,7,8],來看下實現步驟
歸併排序的應用例項
給你一個數組, val arr = Array(8, 4, 5, 7, 1, 3, 6, 2 ), 請使用歸併排序完成排序。
程式碼演示
package com.xuge.sort; import java.util.Arrays; /** * author: yjx * Date :2022/5/3021:22 **/ public class MergeSort { public static void main(String[] args) { int arr[] = {8, 4, 5, 7, 1, 3, 6, 2}; int temp[]=new int [arr.length]; mergeSort(arr, 0, arr.length-1, temp); System.out.println("====歸併排序後==="+ Arrays.toString(arr)); } public static void mergeSort(int[] arr, int left, int right, int temp[]){ if(left<right){ int mid=(left+right)/2; //向左遞迴分解 mergeSort(arr,left,mid, temp); //向右遞迴分解 mergeSort(arr,mid+1,right, temp); //合併 merge(arr,left,mid, right, temp); } } /** * @param arr 陣列 * @param left 左邊索引 * @param mid 中間索引 * @param right 右邊索引 * @param 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陣列的當前索引 //1.先把左右兩邊資料填充到temp陣列 //直到左右兩邊有序序列,有一邊處理為止 while (i <= mid && j <= right) {//繼續執行 //如果左邊有序序列小於等於右邊有序序列當前元素拷貝到temp中 if (arr[i] < arr[j]) { temp[t] = arr[i]; t += 1; i += 1; } else {//反之 右邊有序序列當前元素拷貝到temp中 temp[t] = arr[j]; t += 1; j += 1; } } //2.把有剩餘的一方剩餘資料全部一次填充到temp while (i <= mid) {//說明左邊有序序列剩餘 temp[t] = arr[i]; t += 1; i += 1; } while (j <= right) {//說明右邊有序序列剩餘 temp[t] = arr[j]; t += 1; j += 1; } //3.將temp陣列元素拷貝到arr t = 0; int tempLeft = left; System.out.println("tempLeft="+tempLeft+",right="+right); while(tempLeft<=right){//第一次合併 arr[tempLeft]=temp[t]; t+=1; tempLeft+=1; } } }
速度測試
public static void main(String[] args) { // int arr[] = {8, 4, 5, 7, 1, 3, 6, 2}; // int temp[] = new int[arr.length]; // mergeSort(arr, 0, arr.length - 1, temp); // System.out.println("====歸併排序後===" + Arrays.toString(arr)); int arr2[] = new int[8000000]; for (int i = 0; i < 80000; i++) { arr2[i] = (int) (Math.random() * 800000000);//生成隨機數[0,80000000); } int temp[]=new int [arr2.length]; System.out.println("====輸出陣列====="); Date data = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(data); System.out.println("排序前的時間是:" + str);//23 mergeSort(arr2, 0, arr2.length-1, temp); Date data2 = new Date(); String str2 = sdf.format(data2); System.out.println("排序後的時間是" + str2);//25 }