合并排序(C#)

來源:互聯網
上載者:User

合并排序(C#)

 

  有很多演算法在結構上是遞迴的: 為瞭解決一個給定的問題,演算法要一次或多次的遞迴調用其自身來解決相關的子問題.這些演算法通常採用分治策略: 將原問題劃分為n個規模較小而結構與原問題相似的子問題;遞迴地解決這些子問題,然後再合并其結果,就得到原問題的解.

  分置模式在每一層遞迴上都三個步驟:

     分解: 將原問題分解為一系列子問題.

     解決: 遞迴解決各個子問題.若問題足夠小,則直接求解.

     合并: 將子問題的結果合并成原問題的解. 

  合并排序演算法完全依照了上述模式,直觀地操作如下:

      分解:  將n個元素分成各含n/2個元素的子序列.

      解決:  用合并排序法對兩個子序列遞迴的排序.

      合并:  合并兩個已排序的子序列以得到排序結果.

合并排序的關鍵步驟在於合并兩個已排序的子序列.為了做合并,引入一個輔助過程Merge(int[] a, int[] b).下面以打撲克牌來說明Merge函數的過程.假設有兩堆牌面朝上的放在桌上,每一堆都是已排序的,最小的牌放在最上面.我們希望把這兩堆牌合并成一個排好序的輸出堆,面朝下的放在桌上.基本步驟包括在面朝上的兩堆牌中,選取頂上兩張中較小的一張,將其取出後面朝下的放入輸出堆中.重複這個步驟,直到某一輸入堆為空白為止.這時,把輸入堆中餘下的牌面朝下的放入輸出堆即可.

 

代碼實現如下:

Merge

/// <summary><br /> /// 合并<br /> /// </summary><br /> public static int[] Merge(int[] a, int[] b)<br /> {<br /> int mergeLegth = a.Length + b.Length;<br /> int[] mergeArray = new int[mergeLegth];</p><p> int aIndex = 0;<br /> int bIndex = 0;<br /> for (int i = 0; i < mergeLegth; i++)<br /> {<br /> if (aIndex > a.Length - 1)<br /> {<br /> // 將b的所有剩餘元素合并<br /> for (int j = bIndex; j < b.Length; j++)<br /> {<br /> mergeArray[i++] = b[j];<br /> }<br /> break;<br /> }</p><p> if (bIndex > b.Length - 1)<br /> {<br /> // 將a的所有剩餘元素合并<br /> for (int j = aIndex; j < a.Length; j++)<br /> {<br /> mergeArray[i++] = a[j];<br /> }<br /> break;<br /> }</p><p> if (a[aIndex] <= b[bIndex])<br /> {<br /> mergeArray[i] = a[aIndex];<br /> aIndex++;<br /> }<br /> else<br /> {<br /> mergeArray[i] = b[bIndex];<br /> bIndex++;<br /> }<br /> }<br />

MergeSort

/// <summary><br /> /// 合并排序(升序)<br /> /// </summary><br /> public static int[] MergeSort(int[] needSortArray)<br /> {<br /> if (needSortArray.Length == 1)<br /> return needSortArray;</p><p> // 問題分解<br /> int aStartIndex = 0;<br /> int bStartIndex = needSortArray.Length / 2;<br /> int aLength = bStartIndex - aStartIndex;<br /> int bLength = needSortArray.Length - bStartIndex;<br /> int[] a = new int[aLength];<br /> int[] b = new int[bLength];<br /> Array.Copy(needSortArray, a, aLength);<br /> Array.Copy(needSortArray, bStartIndex, b, 0, bLength);<br /> a = MergeSort(a);<br /> b = MergeSort(b);</p><p> return Merge(a, b);<br /> }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.