最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go歸并排序算法的實現(xiàn)方法

 更新時間:2022年04月06日 15:00:40   作者:KevinYan11  
歸并排序采用的也是分治的策略,把原本的問題先分解成一些小問題進行求解,再把這些小問題各自的答案修整到一起得到原本問題的答案,從而達到分而治之的目的,對Go歸并排序算法相關知識感興趣的朋友一起看看吧

今天繼續(xù)基礎排序算法的圖解和Go 代碼實現(xiàn),這次分享一個時間復雜度為*** 誒,時間復雜度多少先保密,文末會有分析。這次分享的排序算法是—歸并排序(Merge Sort)。

歸并排序的思想

與快速排序一樣,歸并排序采用的也是分治的策略,把原本的問題先分解成一些小問題進行求解,再把這些小問題各自的答案修整到一起得到原本問題的答案,從而達到分而治之的目的。

歸并排序算法會把要排序的序列分成長度相當?shù)膬蓚€子序列,當分無可分每個子序列中只有一個數(shù)據(jù)的時候,就對子序列進行歸并。

歸并指的是把兩個排序好的子序列合并成一個有序序列。該操作會一直重復執(zhí)行,直到所有子序列歸并為一個整體為止。

歸并排序的過程下面我們依然用圖例過一遍歸并排序?qū)σ粋€序列進行排序的過程。

圖例出自—《我的第一本算法書》

首先,假設有下面這樣一個待排序的序列:

待排序的一串數(shù)字

將序列以對半分割的形式分成兩段。

把序列二分成兩段

再繼續(xù)對子序列進行對半分割,分解下去。

再繼續(xù)往下分

直到分無可分,每個子序列中只有一個數(shù)據(jù)。

分解到每個子序列只有一個數(shù)據(jù)

接下來對分割后的數(shù)據(jù)進行合并,合并時需要將數(shù)字按從小到大的順序排列。

合并序列時按大小排序

把 6 和 4 合并,合并時按照數(shù)字大小排序,合并后的順序為【4,6】,接下來把 3 和 7 合并,合并后的順序為【3,7】。

[繼續(xù)按照大小順序合并后面的序列]。

下面,我們看看怎么合并【4,6】和【3,7】這兩個序列。合并這種含有多個數(shù)字的子序列時,要先比較首位數(shù)字,再移動較小的數(shù)字。

合并多元素的序列時,從首位開始比較,小的先移動

這里要比較兩個子序列的首位數(shù)字是4 和 3。由于 4 > 3,所以合并序列時先移動 3。

4 > 3,所以合并序列時先移動 3

接下來,再按照比較兩個序列首位,小的先合并,大的留下來繼續(xù)比較的規(guī)則合并兩個序列。

4 小于 7,所以先移動 4 到合并的序列。

由于4<7,所以移動4

兩個子序列剩下的元素中,6 小于 7,所以先移動 6。

6 < 7 所以先移動 6

最后移動剩下的 7。

子序列最后剩下了7,合并到序列中去

遞歸執(zhí)行上面的操作,直到所有的數(shù)字都合并到一個整體的序列上為止。

小序列合并成兩個大的序列

再繼續(xù)往完整的序列上合并

最后得到一個完整的排序完成的序列 。

排序完成的序列

歸并排序的 Go 代碼實現(xiàn)

下面上一個用歸并排序的Go代碼實現(xiàn),代碼很簡單,實現(xiàn)步驟就都放在了代碼的注釋里,就不再多說啦,先收藏文章(也要記得點贊),等有時間了自己在電腦上運行一下試試吧。

package main
import "fmt"
// 自頂向下歸并排序,排序范圍在 [begin,end) 的數(shù)組
func MergeSort(array []int, begin int, end int) {
    // 元素數(shù)量大于1時才進入遞歸
    if end - begin > 1 {
        // 將數(shù)組一分為二,分為 array[begin,mid) 和 array[mid,high)
        mid := begin + (end-begin+1)/2
        // 先將左邊排序好
        MergeSort(array, begin, mid)
        // 再將右邊排序好
        MergeSort(array, mid, end)
        // 兩個有序數(shù)組進行合并
        merge(array, begin, mid, end)
    }
}
// 歸并操作
func merge(array []int, begin int, mid int, end int) {
    // 申請額外的空間來合并兩個有序數(shù)組,這兩個數(shù)組是 array[begin,mid),array[mid,end)
    leftSize := mid - begin         // 左邊數(shù)組的長度
    rightSize := end - mid          // 右邊數(shù)組的長度
    newSize := leftSize + rightSize // 輔助數(shù)組的長度
    result := make([]int, 0, newSize)
    l, r := 0, 0
    for l < leftSize && r < rightSize {
        lValue := array[begin+l] // 左邊數(shù)組的元素
        rValue := array[mid+r]   // 右邊數(shù)組的元素
        // 小的元素先放進輔助數(shù)組里
        if lValue < rValue {
            result = append(result, lValue)
            l++
        } else {
            result = append(result, rValue)
            r++
        }
    // 將剩下的元素追加到輔助數(shù)組后面
    result = append(result, array[begin+l:mid]...)
    result = append(result, array[mid+r:end]...)
    // 將輔助數(shù)組的元素復制回原數(shù)組,這樣該輔助空間就可以被釋放掉
    for i := 0; i < newSize; i++ {
        array[begin+i] = result[i]
    return

歸并排序的時間復雜度

老規(guī)矩,看完算法思想和實現(xiàn)步驟后,我們再來分析一下歸并排序算法的時間復雜度。

歸并排序中,分割序列所花費的時間不算在運行時間內(nèi) (可以當作序列本來就是分 割好的)。在合并兩個已排好序的子序列時,只需依次比較處在序列首位數(shù)據(jù)的大小,然后移動較小的數(shù)據(jù),因此只需花費和兩個子序列的長度相應的運行時間。也就是說,完成一行歸并所需的運行時間取決于這一行的數(shù)據(jù)量。

看一下這個圖便能得知,無論哪一行都是 n 個數(shù)據(jù),所以每行的運行時間都為 O(n)。

歸并排序每一行的數(shù)據(jù)都是 n 個

而將長度為 n 的序列對半分割直到只有一個數(shù)據(jù)為止時,可以分成 行,因此,總共有 log2n 行。也就是說,總的運行時間為 ,這與前面講到的快速排序相同。

到此這篇關于Go歸并排序算法的實現(xiàn)方法的文章就介紹到這了,更多相關go歸并排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go中的代碼換行問題

    Go中的代碼換行問題

    這篇文章主要介紹了Go中的代碼換行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解Golang 推薦的命名規(guī)范

    詳解Golang 推薦的命名規(guī)范

    這篇文章主要介紹了詳解Golang 推薦的命名規(guī)范,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法

    linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法

    這篇文章主要介紹了linux下通過go語言獲得系統(tǒng)進程cpu使用情況的方法,實例分析了Go語言使用linux的系統(tǒng)命令ps來分析cpu使用情況的技巧,需要的朋友可以參考下
    2015-03-03
  • goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    這篇文章主要為大家介紹了goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • gin解析json格式的數(shù)據(jù)出錯的處理方案

    gin解析json格式的數(shù)據(jù)出錯的處理方案

    這篇文章主要介紹了gin解析json格式的數(shù)據(jù)出錯的處理方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 一文詳解如何在Golang中實現(xiàn)JWT認證與授權

    一文詳解如何在Golang中實現(xiàn)JWT認證與授權

    在現(xiàn)代Web應用中,安全性是一個非常重要的課題,JWT作為一種常用的認證與授權機制,已被廣泛應用于各種系統(tǒng)中,下面我們就來看看如何在Golang中實現(xiàn)JWT認證與授權吧
    2025-03-03
  • 快速升級Go版本(幾分鐘就搞定了)

    快速升級Go版本(幾分鐘就搞定了)

    go現(xiàn)在的更新速度是非常的快啊,用著用著網(wǎng)上的教程就不配套了,下面這篇文章主要給大家介紹了關于快速升級Go版本的相關資料,文中介紹的方法幾分鐘就搞定了,需要的朋友可以參考下
    2024-05-05
  • go 壓縮解壓zip文件源碼示例

    go 壓縮解壓zip文件源碼示例

    這篇文章主要為大家介紹了go壓縮及解壓zip文件的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言項目中使用Viper獲取配置信息詳解

    Go語言項目中使用Viper獲取配置信息詳解

    Viper是Go應用的完整配置解決方案,它能處理所有類型的配置需求和配置格式,這篇文章主要介紹了Go項目中使用Viper獲取配置信息,需要的可以參考下
    2024-04-04
  • golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫的操作方法及?zap日志工具?,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10

最新評論

察隅县| 大竹县| 灌云县| 巴彦淖尔市| 永平县| 兴宁市| 西平县| 九龙县| 福鼎市| 大竹县| 城固县| 嘉定区| 班戈县| 睢宁县| 乐昌市| 陇西县| 赣州市| 淮滨县| 嘉祥县| 万年县| 达孜县| 夹江县| 英山县| 达州市| 西畴县| 建始县| 炎陵县| 阿拉善盟| 柳河县| 清苑县| 铁岭县| 阿城市| 丹凤县| 彭泽县| 科技| 丰城市| 赤城县| 黎川县| 富宁县| 安国市| 延吉市|