1. 程式人生 > 其它 >HMS Core AR Engine 2D圖片/3D物體跟蹤技術 助力打造更智慧AR互動體驗

HMS Core AR Engine 2D圖片/3D物體跟蹤技術 助力打造更智慧AR互動體驗

歸併排序介紹

 

歸併排序(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
  }