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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法:合并排序(Merge Sort)

發布時間:2024/7/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法:合并排序(Merge Sort) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法定義

合并排序是一種遞歸算法,思路如下:

  • 如果源數組長度為 1,立即返回。
  • 將源數組平分為兩個新數組:Left 和 Right。
  • 對 Left 執行遞歸排序。
  • 對 Right 執行遞歸排序。
  • 將排序后的 Left 和 Right 執行合并到原數組。

可以看出來,改算法的重點是已排序數組的合并過程。

算法舉例

【5,4,3,2,1】

【5,4,3】【2,1】

【5,4】【3】【2,1】

【5】【4】【3】【2,1】

【4,5】【3】【2,1】

【3,4,5】【2,1】

【3,4,5】【2】【1】

【3,4,5】【1,2】

【1,2,3,4,5】

算法實現

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Sorts 8 { 9 class MergeSort<T> 10 where T : IComparable<T> 11 { 12 private static void Swap(T[] items, int left, int right) 13 { 14 if (left != right) 15 { 16 var temp = items[left]; 17 items[left] = items[right]; 18 items[right] = temp; 19 } 20 } 21 22 public static void Sort(T[] items) 23 { 24 if (items.Length < 2) 25 { 26 return; 27 } 28 29 int leftSize = items.Length / 2; 30 int rightSize = items.Length - leftSize; 31 32 T[] left = new T[leftSize]; 33 T[] right = new T[rightSize]; 34 35 Array.Copy(items, 0, left, 0, leftSize); 36 Array.Copy(items, leftSize, right, 0, rightSize); 37 38 Sort(left); 39 Sort(right); 40 Merge(items, left, right); 41 } 42 43 private static void Merge(T[] items, T[] left, T[] right) 44 { 45 var leftIndex = 0; 46 var rightIndex = 0; 47 48 for (var i = 0; i < items.Length; i++) 49 { 50 if (leftIndex >= left.Length) 51 { 52 items[i] = right[rightIndex]; 53 rightIndex++; 54 } 55 else if (rightIndex >= right.Length) 56 { 57 items[i] = left[leftIndex]; 58 leftIndex++; 59 } 60 else if (left[leftIndex].CompareTo(right[rightIndex]) < 0) 61 { 62 items[i] = left[leftIndex]; 63 leftIndex++; 64 } 65 else 66 { 67 items[i] = right[rightIndex]; 68 rightIndex++; 69 } 70 } 71 } 72 } 73 }

合并過程

已排序數組的合并過程比較有意思,分別對 Left 和 Right 維護一個從左到右的指針,分別是:leftIndex 和 RightIndex,當填充目標數組的第 i 個元素時,需要從 Left 和 Right 中找到剩余元素(指針到末尾部分的元素)的最小值,因為是已排序數組,只需比較 Left[LeftIndex] 和 Right[RightIndex] 的大小,將最小的元素填充到目標數組的第 i 個位置即可,然后相應的指針加 1。

?

轉載于:https://www.cnblogs.com/happyframework/p/3464645.html

總結

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

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