iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

JavaScript - 30天 - 自學挑戰系列 第 5

關於Merge Sort排序方法與示意圖

  • 分享至 

  • xImage
  •  

Merge Sort
Traversal in Binary Tree:

合併排序是將陣列拆分成兩個幾乎等長的數列,直到每個群組只剩下一個數值時,在合併各組數列。

https://ithelp.ithome.com.tw/upload/images/20220907/20152092MkAw2x0ftb.png

Input: nums = [1, 2, 3, 2, 1, 6]

let mergeSort = (nums) => {
//當陣列只有一個數值時,則不需執行合併,故回傳 nums。
  if (nums.length <= 1) return nums
  
//宣告陣列項目,運用 Math.floor 取得中間值得整數,再透過 slice() 拆分兩個陣列。
  let middleIndex = Math.floor(nums.length / 2)
  let firstHalf = nums.slice(0, middleIndex)
  let secondHalf = nums.slice(middleIndex)

//透過 mergeSort() 來執行每一輪的陣列拆分,。
  return sortBeforeMerge(mergeSort(firstHalf), mergeSort(secondHalf))
  
  function sortBeforeMerge(nums1, nums2) {
    let sortNums = []
//當 nums1 和 nums2 的皆有長度時,執行迴圈內容。
    while (nums1.length && nums2.length) {
//如果 nums1 < num2 ,則運用 shift() 移除 nums1陣列中第一個數值,否則移除 nums2 陣列中第一個數值。
      let minElement = (nums1[0] < nums2[0]) ? nums1.shift() : nums2.shift()
//將取出的數值推入 sortNums 的空陣列中。
      sortNums.push(minElement)
    }
//跳出迴圈代表 nums1 或 nums2 其中一個為空陣列,則將之放入 sortNums 中。
    sortNums = nums1.length ? sortNums.concat(nums1) : sortNums.concat(nums2)
    return sortNums
  }
}

console.log(mergeSort([1, 2, 3, 2, 1, 6]))

Output: newNums = [1, 1, 2, 2, 3, 6]

Flow Chart:

Input: nums = [1, 2, 3, 2, 1, 6]

(middleIndex, nums)
3, [1, 2, 3, 2, 1 ,6]
1, [1, 2, 3], [2, 1 ,6]

firstHalf(middleIndex, nums) | secondHalf(middleIndex, nums)
1, [1], [2, 3]               | 1, [2], [1, 6]
1, [2], [3]                  | 1, [1], [6]

sortNums = firstHalf + secondHalf = [1, 1, 2, 2, 3, 6]

Source:https://pjchender.blogspot.com/2017/09/merge-sort.html
Blog:http://52.198.119.162/關於merge-sort排序方法與示意圖/


上一篇
關於Heap Sort排序方法與示意圖
下一篇
關於Quick Sort排序方法與示意圖
系列文
JavaScript - 30天 - 自學挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言