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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

排序算法-归并排序详细讲解(MergeSort)

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

歸并排序

歸并,指合并,合在一起。歸并排序(Merge Sort)是建立在歸并操作上的一種排序算法。其主要思想是分而治之。

若將兩個有序集合并成一個有序表,稱為2-路歸并,與之對應的還有多路歸并。

怎么分

  • 對于排序最好的情況來講,就是只有兩個元素,這時候比較大小就很簡單,但是還是需要比較
  • 如果拆分為左右各一個,無需比較即是有序的。

怎么治

借助一個輔助空數組,把左右兩邊的數組按照大小比較,按順序放入輔助數組中即可。

以下面兩個有序數組為例:

代碼實現

public static void mergeSort(int[] arr){if (arr == null || arr.length<2){return;}process(arr,0,arr.length-1);}//分治過程private static void process(int[] arr, int L, int R) {if (L == R) {return;}int mid =L+((R-L)>>1);process(arr,L,mid);process(arr,mid+1,R);//遞歸merge(arr,L,mid,R);}private static void merge(int[] arr, int L, int M, int R ) {//設置輔助空間int[] help= new int[R-L+1];int i=0;int p1=L;int p2=M+1;//判斷兩邊值是否越界while(p1<=M && p2<R){//當左邊的值<右邊的值 將左邊的值拷貝到help里去//否則將右邊的值拷貝到help里去help[i++] =arr[p1] <=arr[p2] ? arr[p1++] : arr[p2++];}//如果p1沒有越界,那么將p1剩下的東西全部拷貝到help中去while(p1 <= M){help[i++] =arr[p1++];}//如果p2沒有越界,那么將p2剩下的東西全部拷貝到help中去while(p2 <=R){help[i++]=arr[p2++];}for ( i = 0; i <help.length ; i++) {arr[L+i]=help[i];}}

時間復雜度

歸并排序方法就是把一組n個數的序列,折半分為兩個序列,然后再將這兩個序列再分,一直分下去,直到分為n個長度為1的序列。然后兩兩按大小歸并。如此反復,直到最后形成包含n個數的一個數組。

歸并排序總時間 = 分解時間 + 子序列排好序時間 + 合并時間

無論每個序列有多少數都是折中分解,所以分解時間是個常數,可以忽略不計,則:

歸并排序總時間 = 子序列排好序時間 + 合并時間

假設處理的數據規模大小為 n,運行時間設為:T(n),則T(n) = n,當 n = 1時,T(1) = 1

由于在合并時,兩個子序列已經排好序,所以在合并的時候只需要 if 判斷即可,所以n個數比較,合并的時間復雜度為 n。

  • 將 n 個數的序列,分為兩個 n/2 的序列,則:T(n) = 2T(n/2) + n
  • 將 n/2 個數的序列,分為四個 n/4 的序列,則:T(n) = 4T(n/4) + 2n
  • 將 n/4 個數的序列,分為八個 n/8 的序列,則:T(n) = 8T(n/8) + 3n
  • 將 n/2k 個數的序列,分為2k個 n/2k 的序列,則:T(n) = 2kT(n/2k) + kn

當 T(n/2k) = T(1)時, 即n/2k = 1(此時也是把n分解到只有1個數據的時候),轉換為以2為底n的對數:k = log2n,把k帶入到T(n)中,得:T(n) = n + nlog2n。

使用大O表示法,去掉常數項 n,省略底數 2,則歸并排序的時間復雜度為:O(nlogn)

算法穩定性

從原理分析和代碼可以看出,為在合并的時候,如果相等,選擇前面的元素到輔助數組,所以歸并排序是穩定

總結

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

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