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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

什么是归并排序 mergeSort

發布時間:2023/12/31 编程问答 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是归并排序 mergeSort 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.什么是歸并排序?

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。

作為一種典型的分而治之思想的算法應用,歸并排序的實現由兩種方法:

  • 自上而下的遞歸(所有遞歸的方法都可以用迭代重寫,所以就有了第 2 種方法);
  • 自下而上的迭代;

在《數據結構與算法 JavaScript 描述》中,作者給出了自下而上的迭代方法。但是對于遞歸法,作者卻認為:

However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.

然而,在 JavaScript 中這種方式不太可行,因為這個算法的遞歸深度對它來講太深了。

和選擇排序一樣,歸并排序的性能不受輸入數據的影響,但表現比選擇排序好的多,因為始終都是 O(nlogn) 的時間復雜度。代價是需要額外的內存空間。

2. 算法步驟

歸并排序使用分而治之的概念對給定的元素列表進行排序。它將問題分解為較小的子問題,直到它們變得足夠簡單以至可以直接解決為止。

以下是歸并排序的步驟:

  • 將給定的列表分為兩半(如果列表中的元素數為奇數,則使其大致相等)。
  • 以相同的方式繼續劃分子數組,直到只剩下單個元素數組。
  • 從單個元素數組開始,合并子數組,以便對每個合并的子數組進行排序。
  • 重復第 3 步單元,直到最后得到一個排好序的數組。
  • 3. 動圖演示


    代碼實現

    將兩個已排序子數組合并為一個已排序數組的函數?merge()

    function merge(left, right) {let arr = []// 如果任何一個數組為空,就退出循環while (left.length && right.length) {// 從左右子數組的最小元素中選擇較小的元素if (left[0] < right[0]) {arr.push(left.shift()) } else {arr.push(right.shift()) }}// 連接剩余的元素,防止沒有把兩個數組遍歷完整return [ ...arr, ...left, ...right ] }

    更完整的實現

    function mergeSort(array) {const half = array.length / 2if(array.length < 2){return array }const left = array.splice(0, half)return merge(mergeSort(left),mergeSort(array)) }

    總結

    以上是生活随笔為你收集整理的什么是归并排序 mergeSort的全部內容,希望文章能夠幫你解決所遇到的問題。

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