<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      算法學習:歸并排序

      1、概念

      歸并排序使用了二分法,歸根到底的思想還是分而治之。
      拿到一個長數組,將其不停的分為左邊和右邊兩份,然后以此遞歸分下去。
      將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合 并成一個有序表,稱為二路歸并。
      歸并排序是一種穩定的排序方法。

       

      2、舉例

      1)合并兩個有序數組,偽代碼

          arr_a = [1,4,5,6]
          arr_b = [4,4,8,10]
      偽代碼如下:
          result = []
          idx_a,idx_b
          while idx_a<len(arr_a) and idx_b<len(arr_b):
              if arr_a[idx_a]<=arr_b[idx_b]:
                  result[arr_a[idx_a]]
                  idx_a+=1
              elif arr_a[idx_a]>arr_b[idx_b]
                  result[arr_b[idx_b]]
                  idx_b+=1
          if idx_a==len(arr_a):
              result.extend(arr_b[idx_b:])

      2)對于沒有順序的數組排序

       思想:拆拆拆,合合合

      將一個無序的數組從數組的中間部分無限的拆分,形成前后兩部分(循環拆分)當我們拆分到數組只有一個元素的時候,這個數組就可以看作是一個有序數組,然后再將前后2個部分合并起來,這樣整個數組就有序了。
       
      [11,2,3,43,23,5,6,9,10] len==9 mid =4
      拆:拆分到最有只有一個元素
      [11,2,3,43] [23,5,6,9,10]
      [11,2] [3,43] [23,5] [6,9,10]
      [11] [2] [3] [43] [23] [5] [6] [9,10]
      [11] [2] [3] [43] [23] [5] [6] [9] [10]
      ------------------------------------------------
      合并
      [2,11] [3,43] [5,23] [6,9]
      [2,3,11,43] [5,6,9,23]
      [2,3,5,6,9,11,23,43]
       

       

      3、代碼1:合并兩個有序數組

      def mergerArr(arr_a,arr_b):
          """這個是合并2個有序數組的合并算法"""
          result = []
          idx_a =0
          idx_b =0
          #idx_a和idx_b分別執行數組a和數組b的第一個元素,一次比較兩個指針指向的元素值,取較小元素放入result,然后挪動指針進行比較
          while idx_a<len(arr_a) and idx_b<len(arr_b):
              if arr_a[idx_a]<=arr_b[idx_b]:
                  result.append(arr_a[idx_a])
                  idx_a+=1
              elif arr_a[idx_a]>arr_b[idx_b]:
                  result.append(arr_b[idx_b])
                  idx_b+=1
          #比較結束完了以后,其中一個數組已經取完值了,另外一個數組還沒有
          print("idx_a = %s idx_b = %s"%(idx_a,idx_b))
          if idx_a==len(arr_a):
              result.extend(arr_b[idx_b:])
          else:
              result.extend(arr_a[idx_a:])
          return result
      arr_b = [1,4,5,6]
      arr_a = [4,4,8,10]
      print(mergerArr(arr_a,arr_b))
      #結果
      idx_a = 2 idx_b = 4
      [1, 4, 4, 4, 5, 6, 8, 10]

       

      4、代碼2:無序數組拆分過程

      def mergeSort(arr):
          if len(arr)<=1:
              return arr
          mid = len(arr)//2
          left = mergeSort(arr[:mid])
          right = mergeSort(arr[mid:])
          print("left=%s\nright=%s"%(left,right))
              #拆分后,到只剩下一個元素了mid和left才返回值了,才能做合并的過程
          return mergerArr(left,right)
          
      arr = [11,2,3,43,23,5,6,9]
      print(mergeSort(arr))

       

      5、最終代碼

      def mergerArr(arr_a,arr_b):
          """這個是合并2個有序數組的合并算法"""
          result = []
          idx_a =0
          idx_b =0
          #idx_a和idx_b分別執行數組a和數組b的第一個元素,一次比較兩個指針指向的元素值,取較小元素放入result,然后挪動指針進行比較
          while idx_a<len(arr_a) and idx_b<len(arr_b):
              if arr_a[idx_a]<=arr_b[idx_b]:
                  result.append(arr_a[idx_a])
                  idx_a+=1
              elif arr_a[idx_a]>arr_b[idx_b]:
                  result.append(arr_b[idx_b])
                  idx_b+=1
          #比較結束完了以后,其中一個數組已經取完值了,另外一個數組還沒有
          print("idx_a = %s idx_b = %s"%(idx_a,idx_b))
          if idx_a==len(arr_a):
              result.extend(arr_b[idx_b:])
          else:
              result.extend(arr_a[idx_a:])
          return result
      
      def mergeSort(arr):
          if len(arr)<=1:
              return arr
          mid = len(arr)//2
          left = mergeSort(arr[:mid])
          right = mergeSort(arr[mid:])
          print("left=%s\nright=%s"%(left,right))
          #拆分后,到只剩下一個元素了mid和left才返回值了,才能做合并的過程
          return mergerArr(left,right)
          
      arr = [11,2,3,43,23,5,6,9]
      print(mergeSort(arr))

      結果:

       6、時間復雜度

      由于遞歸拆分的時間復雜度是logN
      然而,進行兩個有序數組排序的方法復雜度是N
      該算法的時間復雜度是N*logN
      所以是O(NlogN)
       
      7、快速排序和歸并排序
      歸并和快排都是用到遞歸的處理方式。
      歸并排序的處理過程是由下到上的,先解決子問題然后再合并的;
      快排和歸并正好相反,快排的處理是由上到下的,是先分區然后再去處理子問題。
       
      歸并是穩定排序,快排不是穩定排序;
      特殊情況歸并的性能比快排稍微好一點。
       

      posted @ 2020-12-07 17:33  hqq的進階日記  閱讀(330)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩av一区二区三区在线| 国产精品 欧美激情 在线播放| 青草青草久热精品视频在线播放 | 一区二区三区国产不卡| 国产一区韩国主播| 久久一区二区中文字幕| 熟女人妻视频| 麻豆国产va免费精品高清在线| 亚洲国产精品日韩AV专区| 69精品丰满人妻无码视频a片| 女人香蕉久久毛毛片精品| 国产精品一区二区av片| 久久精品日日躁夜夜躁| 国产剧情视频一区二区麻豆| 亚洲精品揄拍自拍首页一| 国产精品成人av电影不卡| 国产精品一区二区不卡91| 乱码中文字幕| 在线日韩日本国产亚洲| 国产精品国产精品一区精品 | 国产尤物精品自在拍视频首页| 日韩精品一区二区三区中文无码| 日韩精品 在线 国产 丝袜| 在线播放国产女同闺蜜| 国产精品中文字幕自拍| 日韩美av一区二区三区| 精品国产美女福到在线不卡| 国产精品午夜无码AV天美传媒| 日韩日韩日韩日韩日韩熟女| 国产精品免费看久久久| 亚洲欧美另类激情综合区蜜芽| 99精品国产中文字幕| 陆川县| 极品人妻少妇一区二区三区| 熟女视频一区二区三区嫩草| 一本色道久久综合亚洲精品| 亚洲精品无码在线观看| 国产伦码精品一区二区| 久久婷婷综合色丁香五月| 囯产精品久久久久久久久久妞妞| 国产精品人人爽人人做我的可爱|