日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

归并排序算法图解分析

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归并排序算法图解分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、歸并排序介紹
  • 二、圖解
  • 三、代碼分析
    • 1.合并有序數組
    • 2.分的過程
  • 三、完整代碼

一、歸并排序介紹

歸并排序使用的方法是分治法,即將問題分解為許多類似的小問題然后遞歸求解。

這里不做詳細分析,直接看圖解過程。

二、圖解


分的過程:可以直接除以二分割(這里總數是奇數也可以)。
治的過程:核心是合并兩個有序的數組。

三、代碼分析

1.合并有序數組

歸并排序的核心就是治的過程也就是合并兩個有序的數組。實現過程如下(以升序排序為例):

  • 兩指針分別指向數組的頭部,并構建一個長度是兩個數組之和的臨時數組,用于存儲數據。
  • 兩指針所在位置的值比較,將值小的填入臨時數組中,其所在的指針后移一位。
  • 反復進行2步驟,直到有一個數組的指針越界,將另外一個數組的所有后續元素依次填入臨時數組中,合并完成。
  • 圖解
    以arr1 = {1,5,6};arr2 ={3,7,9}為例。

    左右比較,填入1,左邊后移一位。

    左右比較,填入3,右邊后移一位。

    左右比較,填入5,左邊后移一位。

    左右比較,填入6,左邊后移一位。

    指針越界,將右邊元素依次填入。

    合并完成。

    代碼
    下面代碼中合并的是原始數組中arr[left 到 mid]段與arr[mid+1 到 right]段,故最后將臨時數組temp中的元素拷貝會arr[left 到 right]段(因為整個排序過程是還在原始數組中進行的)。left,mid,right這是進行假想的分割,詳細的分的過程后面的代碼。

    /*** 【合并】兩個有序數組* @param arr 總數組* @param left 左數組開始指針(arr左指針)* @param mid 右數組開始指針* @param right 右指針(arr右指針)*/ public static void merge(int[] arr, int left, int mid, int right){int[] temp = new int[right-left+1];int l = left;//左數組初始索引int m = mid + 1;//右數組初始索引int t = 0;//臨時數組初始索引//1.將左右數組元素按規則填入temp數組中while(l <= mid && m <= right){if(arr[l] > arr[m]){temp[t] = arr[m];m++;t++;}else{temp[t] = arr[l];l++;t++;}}//2.將數組剩余元素填入temp中if(l > mid){while(m <= right){temp[t] = arr[m];m++;t++;}}else{while(l <= mid ){temp[t] = arr[l];l++;t++;}}//3.將temp數組拷貝到arr中t = 0;l = left;while(l <= right){arr[l] = temp[t];l++;t++;}}

    2.分的過程

    代碼
    使用遞歸進行分割,然后使用merge方法合并數組。

    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); //治}}

    三、完整代碼

    public static void main(String[] args) {int arr[] = {4,5,8,20,6,87,12,65,0,855,12,5,78};mergeSort(arr);System.out.println(Arrays.toString(arr));}public static void mergeSort(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); //治}}public static void merge(int[] arr, int left, int mid, int right){int[] temp = new int[right-left+1];int l = left;//左數組初始索引int m = mid + 1;//右數組初始索引int t = 0;//臨時數組初始索引//1.將左右數組元素按規則填入temp數組中while(l <= mid && m <= right){if(arr[l] > arr[m]){temp[t] = arr[m];m++;t++;}else{temp[t] = arr[l];l++;t++;}}//2.將數組剩余元素填入temp中if(l > mid){while(m <= right){temp[t] = arr[m];m++;t++;}}else{while(l <= mid ){temp[t] = arr[l];l++;t++;}}//3.將temp數組拷貝到arr中t = 0;l = left;while(l <= right){arr[l] = temp[t];l++;t++;}} }

    測試結果:
    [0, 4, 5, 5, 6, 8, 12, 12, 20, 65, 78, 87, 855]

    總結

    以上是生活随笔為你收集整理的归并排序算法图解分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。