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

基于Go語言實(shí)現(xiàn)插入排序算法及優(yōu)化

 更新時(shí)間:2022年12月12日 09:24:23   作者:陳明勇  
插入排序是一種簡單的排序算法。這篇文章將利用Go語言實(shí)現(xiàn)冒泡排序算法,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下

插入排序

插入排序是一種簡單的排序算法,以數(shù)組為例,我們可以把數(shù)組看成是多個(gè)數(shù)組組成。插入排序的基本思想是往前面已排好序的數(shù)組中插入一個(gè)元素,組成一個(gè)新的數(shù)組,此數(shù)組依然有序。光看文字可能不理解,讓我們看看圖示:

插入排序的時(shí)間復(fù)雜度為 O(N²)。

算法實(shí)現(xiàn)

import (
    "fmt"
)

func main() {
    nums := [4]int{4, 1, 3, 2}
    fmt.Println("原數(shù)組:", nums)
    fmt.Println("--------------------------------")
    InsertionSort(nums)
}

func InsertionSort(nums [4]int) {
    for i := 1; i < len(nums); i++ {
            for j := i; j > 0 && nums[j] < nums[j-1]; j-- {
                    nums[j], nums[j-1] = nums[j-1], nums[j]
            }
            fmt.Printf("第 %d 輪后:%v\n", i, nums)
    }
    fmt.Println("--------------------------------")
    fmt.Println("排序后的數(shù)組:", nums)
}

執(zhí)行結(jié)果:

原數(shù)組: [4 1 3 2]
--------------------------------
第 1 輪后:[1 4 3 2]
第 2 輪后:[1 3 4 2]
第 3 輪后:[1 2 3 4]
--------------------------------
排序后的數(shù)組: [1 2 3 4]

1.第一層循環(huán)的 i 變量,表示待排序的元素;

2.第二層循環(huán):

j 變量的初值為 i 的值,由 j 變量往前去尋找待插入的位置;

  • 循環(huán)條件為 j > 0 && nums[j] < nums[j - 1]
  • j > 0 → 尋找到左邊界則結(jié)束尋找;

nums[j] < nums[j - 1] → 左邊元素小于待排序的元素則結(jié)束尋找;

3.循環(huán)體為元素交換邏輯,只要滿足循環(huán)條件,則不斷交換元素,直到交換到待插入的位置,才終止。

算法優(yōu)化

上面的代碼,是通過不斷地交換元素,直到無法交換,才能將元素放置到待插入的位置,為了避免頻繁交換元素而導(dǎo)致效率低,將交換的邏輯變成把前面的數(shù)往后移,最后再將待排序的元素插入到合適的位置即可。

import (
    "fmt"
)

func main() {
    nums := [4]int{4, 1, 3, 2}
    fmt.Println("原數(shù)組:", nums)
    fmt.Println("--------------------------------")
    InsertionSort(nums)
}

func InsertionSort(nums [4]int) {
    for i := 1; i < len(nums); i++ {
        t := nums[i]
        j := i
        for ; j > 0 && t < nums[j-1]; j-- {
            nums[j] = nums[j-1]
        }
        nums[j] = t
        fmt.Printf("第 %d 輪后:%v\n", i, nums)
    }
    fmt.Println("--------------------------------")
    fmt.Println("排序后的數(shù)組:", nums)
}

用變量 t 記錄待排序的元素,用 j 變量往前查找,只要前面的數(shù)比 t 大,那么就往后移,最后將 t 插入到合適的位置。

小結(jié)

本文首先對(duì)插入排序進(jìn)行簡單地介紹,通過圖片來演示插入排序的過程,然后使用 Go 語言實(shí)現(xiàn)插入排序的算法。為減少算法中交換次數(shù)的邏輯,對(duì)算法進(jìn)行優(yōu)化,將交換的邏輯變成把前面的數(shù)往后移,最后將待排序的數(shù)插入到合適的位置即可。

除了這種優(yōu)化方式,還有一種改造方式:普通的算法往左查找的方式是線性查找,由于元素是有序的,因此線性查找可以換成二分查找,但是經(jīng)過二分找到待插入的位置之后,也得移動(dòng)前面的元素,相比上面的優(yōu)化方法,還多了 O(logn) 的查找時(shí)間復(fù)雜度,因此我認(rèn)為沒有必要改造成二分查找。

到此這篇關(guān)于基于Go語言實(shí)現(xiàn)插入排序算法及優(yōu)化的文章就介紹到這了,更多相關(guān)Go語言插入排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言如何實(shí)現(xiàn)將[][]byte轉(zhuǎn)為io.Reader

    Go語言如何實(shí)現(xiàn)將[][]byte轉(zhuǎn)為io.Reader

    本文主要介紹了如何在Go語言中實(shí)現(xiàn)將[][]byte轉(zhuǎn)換為io.Reader,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2025-02-02
  • Go Plugins插件的實(shí)現(xiàn)方式

    Go Plugins插件的實(shí)現(xiàn)方式

    目前 Plugins 僅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 調(diào)用,今天通過本文給大家介紹Go Plugins插件的實(shí)現(xiàn)方式,感興趣的朋友一起看看吧
    2021-08-08
  • Golang?IOT中的數(shù)據(jù)序列化與解析過程

    Golang?IOT中的數(shù)據(jù)序列化與解析過程

    這篇文章主要介紹了Golang?IOT中的數(shù)據(jù)序列化與解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 詳解golang RWMutex讀寫互斥鎖源碼分析

    詳解golang RWMutex讀寫互斥鎖源碼分析

    這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • GoLang?channel底層代碼分析詳解

    GoLang?channel底層代碼分析詳解

    Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要梳理一下GoLang?channel底層代碼實(shí)現(xiàn)
    2022-10-10
  • Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例

    Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例

    這篇文章主要介紹了Go語言下載網(wǎng)絡(luò)圖片或文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Go之interface的具體使用

    Go之interface的具體使用

    這篇文章主要介紹了Go之interface的具體使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解Golang如何比較兩個(gè)slice是否相等

    詳解Golang如何比較兩個(gè)slice是否相等

    開發(fā)中常會(huì)遇到需要比較兩個(gè)slice包含的元素是否完全相等的情況,我們通常會(huì)通過兩種方法去比較切片是否相等。這里通過幾個(gè)示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助
    2022-11-11
  • go內(nèi)置函數(shù)copy()的具體使用

    go內(nèi)置函數(shù)copy()的具體使用

    當(dāng)我們?cè)贕o語言中需要將一個(gè)切片的內(nèi)容復(fù)制到另一個(gè)切片時(shí),可以使用內(nèi)置的copy()函數(shù),本文就介紹了go內(nèi)置函數(shù)copy()的具體使用,感興趣的可以了解一下
    2023-08-08

最新評(píng)論

家居| 洱源县| 聂拉木县| 宣武区| 曲阳县| 灌云县| 洪泽县| 新竹市| 陈巴尔虎旗| 昌都县| 常德市| 灵川县| 平安县| 互助| 宝应县| 石阡县| 西藏| 聂荣县| 锦州市| 横峰县| 永修县| 东乌珠穆沁旗| 广河县| 淳安县| 崇礼县| 安西县| 全州县| 巩留县| 龙山县| 叶城县| 余庆县| 化隆| 罗甸县| 莱阳市| 高要市| 油尖旺区| 泗水县| 武功县| 从江县| 甘孜县| 昭平县|