<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          美團(tuán)一面:兩個有序的數(shù)組,如何高效合并成一個有序數(shù)組?

          共 976字,需瀏覽 2分鐘

           ·

          2021-10-24 17:30

          點擊關(guān)注公眾號,回復(fù)“2T”獲取2TB學(xué)習(xí)資源!
          互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù)?2T?有特別禮包
          上一篇:深夜看了張一鳴的微博,讓我越想越后怕

          在說這個題目之前先來說說一個排序算法 “歸并算法

          歸并算法采取思想是分治思想,分治思想簡單說就是分而治之,將一個大問題分解為小問題,將小問題解答后合并為大問題的答案。

          乍一看跟遞歸思想很像,確實如此,分治思想一般就是使用遞歸來實現(xiàn)的。但是需要注意的是:遞歸是代碼實現(xiàn)的方式,分治屬于理論。另外,數(shù)據(jù)結(jié)構(gòu)和算法系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以在線閱讀。

          接下來看一副圖理解下:

          說完它的思想:我們再來分析下時間復(fù)雜度。歸并算法采用的是完全二叉樹的形式。所以可以由完全二叉樹的深度可以得知,整個歸并排序需要進(jìn)行l(wèi)og2n次。

          然后每一次需要消耗O{n}時間。所以總的時間復(fù)雜度為o{nlog2n}。歸并排序是一種比較占用內(nèi)存,但是效率高且穩(wěn)定的算法。

          貼上代碼:

          static?void?Main(string[]?args)?{
          ????int[]?arr?=?new?int[]?{?14,12,15,13,11,16?,10};

          ????int[]?newArr?=?Sort(arr,?new?int[7],?0,?arr.Length?-?1);
          ????for?(int?i?=?0;?i?????{
          ????????Console.WriteLine(newArr[i]);
          ????}

          ????Console.ReadKey();
          }

          public?static?int[]?Sort(int[]?arr,?int[]?result,?int?start,?int?end)
          {
          ????if?(start?>=?end)
          ????????return?null;
          ????int?len?=?end?-?start,?mid?=?(len?>>?1)?+?start;
          ????int?start1?=?start,?end1?=?mid;
          ????int?start2?=?mid?+?1,?end2?=?end;
          ????Sort(arr,?result,?start1,?end1);
          ????Sort(arr,?result,?start2,?end2);
          ????int?k?=?start;
          ????//進(jìn)行比較。注意這里++是后執(zhí)行的,先取出來數(shù)組中的值然后++
          ????while?(start1?<=?end1?&&?start2?<=?end2)
          ????????result[k++]?=?arr[start1]?????//將每個分組剩余的進(jìn)行復(fù)制
          ????while?(start1?<=?end1)?
          ????????result[k++]?=?arr[start1++];
          ????//將每個分組剩余的進(jìn)行復(fù)制
          ????while?(start2?<=?end2)
          ????????result[k++]?=?arr[start2++];?
          ????for?(k?=?start;?k?<=?end;?k++)
          ????????arr[k]?=?result[k];
          ????return?result;
          }
          說完了歸并算法回到題目上來 首先分析下 題目給定的是兩個已經(jīng)排好序的數(shù)組合并,關(guān)鍵字“合并”,“兩個”,正好符合我們的歸并算法,并且已經(jīng)分類好了,只需要去合并就可以了。

          來看下幾張圖。

          藍(lán)色的箭頭表示最終選擇的位置,而紅色的箭頭表示兩個數(shù)組當(dāng)前要比較的元素,比如當(dāng)前是2與1比較,1比2小,所以1放到藍(lán)色的箭頭中,藍(lán)色的箭頭后移,1的箭頭后移。

          然后2與4比較,2比4小那么2到藍(lán)色的箭頭中,藍(lán)色箭頭后移,2后移,繼續(xù)比較.......
          歸并思路就是這樣了,最后唯一需要注意的是那個先比較完的話,那么剩下的直接不需要比較,把后面的直接移上去就可以了,這個需要提前判定一下。另外,數(shù)據(jù)結(jié)構(gòu)系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺發(fā)送:2T,可以免費獲取。
          貼上代碼:
          static?void?Main(string[]?args)?{
          ????int[]?arr1?=?new?int[]?{?2,?3,?6,?8?};
          ????int[]?arr2?=?new?int[]?{?1,?4,?5,?7?};
          ????int[]?newArr?=?Sort(arr1,?arr2);
          ????for?(int?i?=?0;?i?????{
          ????????Console.WriteLine(newArr[i]);
          ????}

          ????Console.ReadKey();
          }

          public?static?int[]?Sort(int[]?arr1,int[]?arr2)
          {
          ????int[]?newArr?=?new?int[arr1.Length?+?arr2.Length];
          ????int?i?=?0,?j?=?0,?k?=?0;
          ????while?(i?????{
          ????????if?(arr1[i]?????????{

          ????????????newArr[k]?=?arr1[i];
          ????????????i++;
          ????????????k++;
          ????????}
          ????????else
          ????????{

          ????????????newArr[k]?=?arr2[j];
          ????????????j++;
          ????????????k++;
          ????????}
          ????}

          ????while?(i?????????newArr[k++]?=?arr1[i++];
          ????while?(j?????????newArr[j++]?=?arr2[j++];
          ????return?newArr;
          }
          最后感謝一下大佬提供的思路:

          https://blog.csdn.net/k_koris/article/details/80508543

          原文鏈接:https://blog.csdn.net/weixin_40097554/article/details/108656165/


          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

          ??? · END ·
          最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧

          4.程序員一般可以從什么平臺接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個最新訪問版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  靠逼视频网站 | 欧美操操| 美女激情操逼网站 | 影音先锋色五月 | 干屄网站 |