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

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

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

      16 歸并排序(Merge Sort)

      1 題目

      題目:Sort Integer II

      lintcode題號——464,難度——easy

      描述:給一組整數,請將其在原地按照升序排序。可使用歸并排序,快速排序,堆排序或者任何其他O(n*log n)的排序算法。

      樣例1:

      輸入:[3,2,1,4,5],
      輸出:[1,2,3,4,5]。

      樣例2:

      輸入:[2,3,1],
      輸出:[1,2,3]。

      2 思路

      ??歸并排序基于分治法,將復雜的大問題分解成足夠簡單的小問題,分而治之。先進行分解的步驟,將原本無序的序列至頂向下不斷進行二分,直到不可再分,即每個分組都只剩一個元素;之后進行合并的步驟,將分組按照原來拆分的過程,兩兩合并,在合并的過程中需要按照升序或者降序的需求對元素進行比較,使得合并后的每個小序列都是有序的,直到合并成完整的大序列。

      歸并排序的步驟:

      1. 將序列不斷向下二分;
      2. 直到不可再分,每個分組只有單個元素;(此時每個分組都是有序的)
      3. 將有序分組兩兩向上合并成有序;(合并兩個有序數組)
      4. 直到所有分組合并成完整的序列。

      ??關于將兩個原本就有序(假設升序)的分組合并成一個完整有序的分組,我們只需要依次比較分組的頭元素,每次都將較小的元素有序放入新分組,最后一定有一個分組先放完,另一個分組剩下若干個元素,直接將不為空的分組剩余元素(原本就是有序的)放入新分組,這樣新分組里的元素就全部都是有序的了。

      合并兩個有序數組的步驟:(新數組存放合并后的結果)

      1. 比較兩個數組的頭元素;
      2. 將較小的元素從原數組中取出,放入新數組;
      3. 重復上述1、2步驟,直到兩個數組中的一個為空;
      4. 將另一個不為空的數組所有元素放入新數組;
      5. 此時的新數組內的元素即為有序的。

      2.1 圖解

      合并兩個有序數組的流程:

      graph TD A[A--'1, 2, 5, 7'<br/>B--'3, 4, 6, 8, 9'] --> X X[/比較頭元素'1'和'3', 較小元素放入:C--'1'\] --> A1 A1[A--'_, 2, 5, 7'<br/>B--'3, 4, 6, 8, 9'] --> X1 X1[/比較頭元素'2'和'3', 較小元素放入:C--'1, 2'\]--> A2 A2[A--'_, _, 5, 7'<br/>B--'3, 4, 6, 8, 9'] --> X2 X2[/比較頭元素'5'和'3', 較小元素放入:C--'1, 2, 3'\]--> A3 A3[A--'_, _, 5, 7'<br/>B--'_, 4, 6, 8, 9'] --> X3 X3[/比較頭元素'5'和'4', 較小元素放入:C--'1, 2, 3, 4'\]--> A4 A4[A--'_, _, 5, 7'<br/>B--'_, _, 6, 8, 9'] --> X4 X4[/比較頭元素'5'和'6', 較小元素放入:C--'1, 2, 3, 4, 5'\]--> A5 A5[A--'_, _, _, 7'<br/>B--'_, _, 6, 8, 9'] --> X5 X5[/比較頭元素'7'和'6', 較小元素放入:C--'1, 2, 3, 4, 5, 6'\]--> A6 A6[A--'_, _, _, 7'<br/>B--'_, _, _, 8, 9'] --> X6 X6[/比較頭元素'7'和'8', 較小元素放入:C--'1, 2, 3, 4, 5, 6, 7'\]--> A7 A7[A--'_, _, _, _'<br/>B--'_, _, _, 8, 9'] --> X7 X7(A已空, B直接放入:C--'1, 2, 3, 4, 5, 6, 7, 8, 9', 有序數組C)

      歸并排序的流程:

      graph TD A1['3, 5, 7, 4, 9, 8, 2, 10, 1, 6'] A1 -- 二分拆分 --> B1['3, 5, 7, 4, 9'] A1 -- 二分拆分 --> B2['8, 2, 10, 1, 6'] B1 -- 拆分 --> C1['3, 5, 7'] B1 -- 拆分 --> C2['4, 9'] B2 -- 拆分 --> C3['8, 2, 10'] B2 -- 拆分 --> C4['1, 6'] C1 -- 拆分 --> D1['3, 5'] C1 -- 拆分 --> D2['7'] C2 -- 拆分 --> D3['4'] C2 -- 拆分 --> D4['9'] C3 -- 拆分 --> D5['8, 2'] C3 -- 拆分 --> D6['10'] C4 -- 拆分 --> D7['1'] C4 -- 拆分 --> D8['6'] D1 -- 拆分 --> E1['3'] D1 -- 拆分 --> E2['5'] D5 -- 拆分 --> E3['8'] D5 -- 拆分 --> E4['2'] E1 -- 合并有序數組 --> F1['3, 5'] E2 -- 合并有序數組 --> F1 E3 -- 合并有序數組 --> F2['2, 8'] E4 -- 合并有序數組 --> F2 F1 -- 合并 --> G1['3, 5, 7'] D2 -- 合并有序數組 --> G1 D3 -- 合并有序數組 --> G2['4, 9'] D4 -- 合并有序數組 --> G2 F2 -- 合并 --> G3['2, 8, 10'] D6 -- 合并有序數組 --> G3 D7 -- 合并有序數組 --> G4['1, 6'] D8 -- 合并有序數組 --> G4 G1 -- 合并有序數組 --> H1['3, 4, 5, 7, 9'] G2 -- 合并有序數組 --> H1 G3 -- 合并 --> H2['1, 2, 6, 8, 10'] G4 -- 合并 --> H2 H1 -- 合并 --> I1['1, 2, 3, 4, 5, 6, 7, 8, 9, 10'] H2 -- 合并 --> I1 style E1 fill: #f9f, stroke: #333, stroke-width: 4px; style E2 fill: #f9f, stroke: #333, stroke-width: 4px; style D2 fill: #f9f, stroke: #333, stroke-width: 4px; style D3 fill: #f9f, stroke: #333, stroke-width: 4px; style D4 fill: #f9f, stroke: #333, stroke-width: 4px; style E3 fill: #f9f, stroke: #333, stroke-width: 4px; style E4 fill: #f9f, stroke: #333, stroke-width: 4px; style D6 fill: #f9f, stroke: #333, stroke-width: 4px; style D7 fill: #f9f, stroke: #333, stroke-width: 4px; style D8 fill: #f9f, stroke: #333, stroke-width: 4px;

      2.2 時間復雜度

      ??歸并排序使用遞歸實現,對包含n個元素的數組,計算其時間復雜度,先分析拆分過程:

      第一層將n個數劃分為2個分組,每個分組包含n/2個元素;
      第二層將n個數劃分為4個分組,每個分組包含n/4個元素;
      第三層將n個數劃分為8個分組,每個分組包含n/8個元素;
      ……
      第log n層將n個數劃分為n個分組,每個分組包含1個元素。

      ??再看合并過程:

      第log n層將n分組合并成n/2個分組,每個元素都會被遍歷一次,每個元素耗時O(1),該層耗時O(n);
      ……
      第3層將8分組合并成4個分組,每個元素都會被遍歷一次,每個元素耗時O(1),該層耗時O(n);
      第2層將4分組合并成2個分組,每個元素都會被遍歷一次,每個元素耗時O(1),該層耗時O(n);
      第1層將2分組合并成1個分組,每個元素都會被遍歷一次,每個元素耗時O(1),該層耗時O(n);

      ??所以每層耗時為O(n),層數為log n,算法的時間復雜度為O(n*log n)。

      2.3 空間復雜度

      ??算法不能原地排序,需要用到一個與原數組一樣大的空間用來存放臨時數據,算法的空間復雜度為O(n)。

      3 源碼

      ??注意事項:

      1. 需要使用一個臨時數組,存放每次遞歸過程中合并兩個有序數組之后的結果,排序完成再復制會原數組,否則直接原地排序會打亂原數組的元素。
      2. 歸并排序是遞歸算法,注意遞歸的三要素,防止死循環。
      3. 合并有序數組時候,需要注意左右兩個數組的起點位置。

      ??C++版本:

      /**
      * @param A: an integer array
      * @return: nothing
      */
      void sortIntegers2(vector<int> &A) {
          // write your code here
          if (A.size() <= 1)
          {
              return;
          }
      
          vector<int> temp(A.size());
          mergeSort(A, 0, A.size() - 1, temp);
      }
      
      // 遞歸的定義
      void mergeSort(vector<int> & A, int start, int end, vector<int> & temp)
      {
          if (start >= end) // 遞歸的出口
          {
              return;
          }
      
          int mid = start + (end - start) / 2; // 取中點
          mergeSort(A, start, mid, temp); // 遞歸的拆解
          mergeSort(A, mid + 1, end, temp);
          merge(A, start, mid, end, temp);
      }
      
      // 合并有序數組
      void merge(vector<int> & A, int start, int mid, int end, vector<int> & temp)
      {
          int left = start;
          int right = mid + 1; // 注意此處的起點是中點的下一個元素
          int index = start;
          while (left <= mid && right <= end)
          {
              if (A.at(left) < A.at(right))
              {
                  temp.at(index++) = A.at(left++);
              }
              else
              {
                  temp.at(index++) = A.at(right++);
              }
          }
      
          while (left <= mid)
          {
              temp.at(index++) = A.at(left++);
          }
          while (right <= end)
          {
              temp.at(index++) = A.at(right++);
          }
      
          // 將臨時數組中排好序的元素復制會原數組
          for (int i = start; i <= end; i++)
          {
              A.at(i) = temp.at(i);
          }
      }
      
      posted @ 2021-11-04 22:29  seedoubleu  閱讀(83)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久精品女人的天堂av| 国产成人不卡一区二区| 少妇熟女久久综合网色欲| 亚洲精品熟女一区二区| 99久久免费精品色老| 欧美颜射内射中出口爆在线| 日韩精品 在线一区二区| 欧美日本激情| 亚洲高清偷拍一区二区三区| 泸州市| 久久老熟女一区二区蜜臀| 国产精品日日摸夜夜添夜夜添无码| 四虎影视国产精品永久在线| 少妇又爽又刺激视频| 成人精品国产一区二区网| 猫咪AV成人永久网站在线观看| 国产成人av三级在线观看| 中文字幕国产精品综合| 精品久久久久中文字幕日本| 国产高清在线精品一区二区三区| 亚洲人成人网站色www| 亚洲中文字幕伊人久久无码| 国产精品中文字幕第一页| 国产成人女人在线观看| 乱色老熟妇一区二区三区| 亚洲综合色区另类av| 成人区人妻精品一区二区 | 国产一区二区不卡91| 麻豆一区二区中文字幕| 亚洲精品一品二品av| 久久精品无码免费不卡| 99久久国产成人免费网站| 九九热免费精品在线视频| 日本国产精品第一页久久| 欧美级特黄aaaaaa片| 男人的天堂va在线无码| 国内精品免费久久久久电影院97| 国产成人精品亚洲午夜| 亚洲人成自拍网站在线观看| 国产成人亚洲欧美二区综合| 狠狠做五月深爱婷婷天天综合|