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

Golang中堆排序的實(shí)現(xiàn)

 更新時(shí)間:2022年04月24日 09:55:02   作者:zhijie  
堆是一棵基于數(shù)組實(shí)現(xiàn)的特殊的完全二叉樹(shù),本文主要介紹了Golang中堆排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

堆排序

堆的概念:

堆是一棵基于數(shù)組實(shí)現(xiàn)的特殊的完全二叉樹(shù),這棵二叉樹(shù)的每個(gè)節(jié)點(diǎn)的值必須大于或小于它的兩個(gè)子節(jié)點(diǎn)。大頂堆是每個(gè)節(jié)點(diǎn)的值必須大于它的兩個(gè)子節(jié)點(diǎn),小頂堆則相反。

堆的頂點(diǎn)必定是ta的最大值或最小值

堆在數(shù)組中的存儲(chǔ)形式:

滿足完全二叉樹(shù)的情況下,數(shù)組中的每個(gè)元素依次插入堆中。如圖:

[9,8,9,8,7,6,4,1,2,0]的存儲(chǔ)形式是這樣的

堆的性質(zhì):

假定數(shù)組nums的長(zhǎng)度為leng

  • 堆的最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)下標(biāo)為leng/2-1

  • 任何一個(gè)下標(biāo)為n的節(jié)點(diǎn)的左右子節(jié)點(diǎn)下標(biāo)為:左子節(jié)點(diǎn)ln = n*2+1,右子節(jié)點(diǎn)rn = n*2+2。前提是lnrn小于leng-1,即沒(méi)有下標(biāo)溢出,若溢出表明沒(méi)有該子節(jié)點(diǎn)

從數(shù)組到堆的構(gòu)建:

大頂堆為例:

先將數(shù)組以此插入完全二叉樹(shù)中,形成一顆完全二叉樹(shù)。(這步什么也不用再,看上圖,腦補(bǔ))

堆的構(gòu)建是從右往左、自下而上的。從最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)leng/2-1開(kāi)始依次遞減。
  • 判斷左右子節(jié)點(diǎn)的是否存在
  • 判斷是否需要替換。子節(jié)點(diǎn)的值是否大于當(dāng)前節(jié)點(diǎn)的值
  • 如果替換,那么被替換的子節(jié)點(diǎn)也要左一次堆的構(gòu)建

得到個(gè)堆

代碼實(shí)現(xiàn)

func buildHeep(nums []int, len int) {
	// 找到最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)
	parent := len/2 - 1
	for parent >= 0 {
		heapify(nums, parent, len)
		parent--
	}
}

func heapify(nums []int, parent, len int) {
	// 判斷兩個(gè)子節(jié)點(diǎn)是否比父節(jié)點(diǎn)大,如果是的話替換
	max := parent
	lson := parent*2 + 1
	rson := parent*2 + 2
	if lson < len && nums[lson] > nums[max] {
		// 左節(jié)點(diǎn)是否大于父節(jié)點(diǎn)
		max = lson
	}
	if rson < len && nums[rson] > nums[max] {
		// 右節(jié)點(diǎn)是否大于父節(jié)點(diǎn)
		max = rson
	}
	if parent != max {
		swap(&nums[max], &nums[parent])
		heapify(nums, max, len)
	}
}
nums :=[]int{3, 5, 3, 0, 8, 6}
buildHeep(nums,len(nums))
// 結(jié)果 : [8 5 6 0 3 3]

堆排序:

大頂堆為例:

得到堆之后只能確定一個(gè)最值,即頂點(diǎn)是最大值。繼而:

將頂點(diǎn)和最后一個(gè)點(diǎn)調(diào)換位置,最后一個(gè)節(jié)點(diǎn)變?yōu)樽畲笾?/p>

數(shù)組下標(biāo)為0至倒數(shù)第二位即最大值前一位,再做一次堆構(gòu)建,又可以獲得一個(gè)最大值

繼續(xù)以上步驟,這一次的最后一位是在上一次的基礎(chǔ)上的

將頂點(diǎn)和最后一個(gè)點(diǎn)調(diào)換位置,最后一個(gè)節(jié)點(diǎn)變?yōu)樽畲笾?/p>

數(shù)組下標(biāo)為0至倒數(shù)第二位即最大值前一位,再做一次堆構(gòu)建,又可以獲得一個(gè)最大值

直到遍歷到數(shù)組長(zhǎng)度為2,得到排序后的數(shù)組

func HeapSort(nums []int) []int {
	// 堆排序,只能確認(rèn)第一次個(gè)數(shù)是最大或最小的
	// 調(diào)換第一個(gè)元素和最后一個(gè)元素位置、從0倒數(shù)第二個(gè)繼續(xù)堆排序
	i := len(nums)
	for i > 1 {
		buildHeep(nums, i)
		swap(&nums[0], &nums[i-1])
		i--
	}

	return nums
}

一行為一次堆疊化

完整代碼:

// heap.go
package structpk

import "fmt"

/*
	給定整數(shù)數(shù)組nums和k,
	請(qǐng)返回?cái)?shù)組中第k個(gè)最大元素,
	請(qǐng)注意,你需要找的是數(shù)組排序后的第k個(gè)最大元素,
	而不是第k個(gè)不同的元素
*/
func swap(a, b *int) {
	*a, *b = *b, *a
}

func HeapSort(nums []int) []int {
	// 堆排序,只能確認(rèn)第一次個(gè)數(shù)是最大或最小的
	// 調(diào)換第一個(gè)元素和最后一個(gè)元素位置、從0倒數(shù)第二個(gè)繼續(xù)堆排序
	i := len(nums)
	for i > 1 {
		buildHeep(nums, i)
		swap(&nums[0], &nums[i-1])
		i--
	}

	return nums
}
func buildHeep(nums []int, len int) {
	// 找到最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)
	parent := len/2 - 1
	for parent >= 0 {
		heapify(nums, parent, len)
		parent--
	}
	fmt.Println(nums[0:len])

}

func heapify(nums []int, parent, len int) {
	// 判斷兩個(gè)子節(jié)點(diǎn)是否比父節(jié)點(diǎn)大,如果是的話替換
	max := parent
	lson := parent*2 + 1
	rson := parent*2 + 2
	if lson < len && nums[lson] > nums[max] {
		// 左節(jié)點(diǎn)是否大于父節(jié)點(diǎn)
		max = lson
	}
	if rson < len && nums[rson] > nums[max] {
		// 右節(jié)點(diǎn)是否大于父節(jié)點(diǎn)
		max = rson
	}
	if parent != max {
		swap(&nums[max], &nums[parent])
		heapify(nums, max, len)
	}
}
// main.go:
package main

import (
	"demo/structpk"
	"fmt"
)
func main() {

	fmt.Println(structpk.HeapSort([]int{
		3, 5, 3, 0, 8, 6,
	}))
}

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

相關(guān)文章

  • Go代碼檢查的推薦工具及使用詳解

    Go代碼檢查的推薦工具及使用詳解

    這篇文章主要為大家介紹了Go代碼檢查的推薦工具及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang連接池檢查連接失敗時(shí)如何重試(示例代碼)

    golang連接池檢查連接失敗時(shí)如何重試(示例代碼)

    在Go中,可以通過(guò)使用database/sql包的DB類型的Ping方法來(lái)檢查數(shù)據(jù)庫(kù)連接的可用性,本文通過(guò)示例代碼,演示了如何在連接檢查失敗時(shí)進(jìn)行重試,感興趣的朋友一起看看吧
    2023-10-10
  • Go 語(yǔ)言 JSON 標(biāo)準(zhǔn)庫(kù)的使用

    Go 語(yǔ)言 JSON 標(biāo)準(zhǔn)庫(kù)的使用

    今天通過(guò)本文給大家介紹Go 語(yǔ)言 JSON 標(biāo)準(zhǔn)庫(kù)的使用小結(jié),包括序列化和反序列化的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-10-10
  • 解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed(推薦)

    解決golang編譯提示dial tcp 172.217.160.113:443: con

    這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問(wèn)題完美解決,需要的朋友可以參考下
    2023-02-02
  • 如何通過(guò)Golang的container/list實(shí)現(xiàn)LRU緩存算法

    如何通過(guò)Golang的container/list實(shí)現(xiàn)LRU緩存算法

    文章介紹了Go語(yǔ)言中container/list包實(shí)現(xiàn)的雙向鏈表,并探討了如何使用鏈表實(shí)現(xiàn)LRU緩存,LRU緩存通過(guò)維護(hù)一個(gè)雙向鏈表來(lái)管理數(shù)據(jù),確保在插入和刪除操作時(shí)能夠以O(shè)(1)的平均時(shí)間復(fù)雜度運(yùn)行,提供了鏈表的操作和使用場(chǎng)景,并附帶了實(shí)現(xiàn)LRU緩存的代碼示例,感興趣的朋友一起看看吧
    2025-03-03
  • Golang中HttpRouter路由的使用詳解

    Golang中HttpRouter路由的使用詳解

    httprouter?是一個(gè)高性能、可擴(kuò)展的HTTP路由,本文將通過(guò)一些簡(jiǎn)單的示例為大家講講httprouter?這個(gè)強(qiáng)大的?HTTP?路由是如何使用的,感興趣的小伙伴可以了解一下
    2023-05-05
  • go語(yǔ)言中函數(shù)與方法介紹

    go語(yǔ)言中函數(shù)與方法介紹

    這篇文章介紹了go語(yǔ)言中的函數(shù)與方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言map字典用法實(shí)例分析

    Go語(yǔ)言map字典用法實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言map字典用法,實(shí)例分析了map字典的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享

    Go語(yǔ)言學(xué)習(xí)之golang-jwt/jwt的教程分享

    jwt是?json?web?token的簡(jiǎn)稱。go使用jwt目前,主流使用的jwt庫(kù)是golang-jwt/jwt。本文就來(lái)和大家講講golang-jwt/jwt的具體使用,需要的可以參考一下
    2023-01-01
  • Golang設(shè)計(jì)模式中的橋接模式詳細(xì)講解

    Golang設(shè)計(jì)模式中的橋接模式詳細(xì)講解

    橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過(guò)橋接模式可以將抽象部分和它的實(shí)現(xiàn)部分分離,本文主要介紹了GoLang橋接模式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-01-01

最新評(píng)論

辉县市| 台南县| 布尔津县| 尚义县| 友谊县| 正蓝旗| 旬阳县| 凌海市| 德州市| 邓州市| 沧源| 黎城县| 翁源县| 凤冈县| 庄浪县| 武义县| 宝应县| 海盐县| 南靖县| 湖州市| 视频| 枣强县| 新晃| 青神县| 博兴县| 涟水县| 健康| 临武县| 呼和浩特市| 长治市| 高州市| 惠安县| 迁西县| 佛学| 资溪县| 万载县| 富平县| 上犹县| 象山县| 四川省| 汶上县|