欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)

 更新時間:2022年01月21日 09:57:21   作者:李晨毅  
本文主要介紹了golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

歸并排序

歸并排序使用經(jīng)典的分治法(Divide and conquer)策略。分治法會將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補(bǔ)"在一起,即分而治之。

在這里插入圖片描述

func sortArray(nums []int) []int {
    if len(nums) <= 1 {
        return nums
    }
    partA := sortArray(nums[:len(nums)/2])
    partB := sortArray(nums[len(nums)/2:])
    
    temp := make([]int, len(partA) + len(partB))

    aPointer := 0
    bPointer := 0
    i := 0
    
    for aPointer < len(partA) && bPointer < len(partB) {
        if partA[aPointer] < partB[bPointer] {
            temp[i] = partA[aPointer]
            aPointer++
        } else {
            temp[i] = partB[bPointer]
            bPointer++
        }
        i++
    }
    for aPointer < len(partA) {
        temp[i] = partA[aPointer]
        aPointer++
        i++
    }
    for bPointer < len(partB) {
        temp[i] = partB[bPointer]
        bPointer++
        i++
    }
    return temp
}

快速排序

快速排序算法采用的分治算法,因此對一個子數(shù)組A[p…r]進(jìn)行快速排序的三個步驟為:

 ?。?)分解:數(shù)組A[p...r]被劃分為兩個(可能為空)子數(shù)組A[p...q-1]和A[q+1...r],給定一個樞軸,使得A[p...q-1]中的每個元素小于等于A[q],A[q+1...r]中的每個元素大于等于A[q],q下標(biāo)是在劃分過程中計(jì)算得出的。

 ?。?)解決:通過遞歸調(diào)用快速排序,對子數(shù)組A[p...q-1]和A[q+1...r]進(jìn)行排序。

  (3)合并:因?yàn)閮蓚€子數(shù)組是就地排序,不需要合并操作,整個數(shù)組A[p…r]排序完成。

在這里插入圖片描述

func sortArray(nums []int) []int {
    quickSort(nums)
    return nums
}

func quickSort(nums []int) {
    left, right := 0, len(nums) - 1
    for right > left {
        // 右邊部分放大于
        if nums[right] > nums[0] {
            right--
            continue
        }
        // 左邊部分放小于等于
        if nums[left] <= nums[0] {
            left++
            continue
        }
        nums[left], nums[right] = nums[right], nums[left]
    }
    nums[0], nums[right] = nums[right], nums[0]
    if len(nums[:right]) > 1 {
        sortArray(nums[:right])
    }
    if len(nums[right + 1:]) > 1 {
        sortArray(nums[right + 1:])
    }
}

堆排序

在這里插入圖片描述

func sortArray(nums []int) []int {
    // 從n/2  最后一個非葉子結(jié)點(diǎn)起開始構(gòu)建大頂堆
    for i := len(nums) / 2; i >= 0; i-- {
        heapSort(nums, i)
    }

    end := len(nums) - 1
    // 每次將大頂堆的最大值與末尾進(jìn)行交換,并再次排序
    for end > 0 {
        nums[0], nums[end] = nums[end], nums[0]
        heapSort(nums[:end], 0)
        end--
    }
    return nums


}


// 對一個非葉子結(jié)點(diǎn)進(jìn)行排序
func heapSort(nums []int,  pos int) {
    end := len(nums) - 1
    left := 2 * pos + 1

    if left > end {
        return
    }

    right := 2 * pos + 2
    temp := left

    // 先左右子結(jié)點(diǎn)進(jìn)行比較,找出較小的那一個
    if right <= end && nums[right] > nums[temp] {
        temp = right
    }

    if nums[temp] <= nums[pos] {
        return
    }

    nums[temp], nums[pos] = nums[pos], nums[temp]

    // 如果發(fā)生了交換的話 就要繼續(xù)調(diào)查后續(xù)子節(jié)點(diǎn)(只調(diào)查交換了的后續(xù),不用全調(diào)查,不然會超時)
    heapSort(nums, temp)
}

卑鄙排序

在這里插入圖片描述

func sortArray(nums []int) []int {
    sort.Ints(nums)
    return nums
}

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

相關(guān)文章

  • GOLang單元測試用法詳解

    GOLang單元測試用法詳解

    Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實(shí)現(xiàn)單元測試和性能測試。本文將通過示例詳細(xì)聊聊Go語言單元測試的原理與使用,需要的可以參考一下
    2022-12-12
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語言中,Goroutine是一種輕量級線程,它的退出機(jī)制對于并發(fā)編程至關(guān)重要,下午就來介紹幾種Goroutine的退出機(jī)制,希望對大家有所幫助
    2023-06-06
  • 關(guān)于Golang中range指針數(shù)據(jù)的坑詳解

    關(guān)于Golang中range指針數(shù)據(jù)的坑詳解

    這篇文章主要給大家介紹了關(guān)于Golang中range指針數(shù)據(jù)的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 如何有效控制Go線程數(shù)實(shí)例探究

    如何有效控制Go線程數(shù)實(shí)例探究

    這篇文章主要為大家介紹了如何有效控制?Go?線程數(shù)的問題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang異??刂铺幚沓绦蝈e誤流程

    Golang異??刂铺幚沓绦蝈e誤流程

    這篇文章主要介紹了Golang異??刂铺幚沓绦蝈e誤流程,Golang異常處理機(jī)制包括錯誤處理、panic和defer,可控制程序錯誤流程,保證程序穩(wěn)定性和安全性,是Golang編程的關(guān)鍵方式
    2023-04-04
  • Go語言中日期包(time包)的具體使用

    Go語言中日期包(time包)的具體使用

    本文主要介紹了Go語言中日期包的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Go語言執(zhí)行系統(tǒng)命令行命令的方法

    Go語言執(zhí)行系統(tǒng)命令行命令的方法

    這篇文章主要介紹了Go語言執(zhí)行系統(tǒng)命令行命令的方法,實(shí)例分析了Go語言操作系統(tǒng)命令行的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang?HTTP服務(wù)超時控制實(shí)現(xiàn)原理分析

    Golang?HTTP服務(wù)超時控制實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Golang?HTTP服務(wù)超時控制實(shí)現(xiàn)原理,HTTP服務(wù)的超時控制是保障服務(wù)高可用性的重要措施之一,由于HTTP服務(wù)可能會遇到網(wǎng)絡(luò)延遲,資源瓶頸等問題,因此需要對請求進(jìn)行超時控制,以避免服務(wù)雪崩等問題,需要的朋友可以參考下
    2023-05-05
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    這篇文章主要為大家介紹了Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論