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

基于Go語言實現(xiàn)冒泡排序算法

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

冒泡排序

冒泡排序是交換排序中最簡單的一種算法。 算法思路:

  • 遍歷數(shù)組,相鄰的兩個元素進行比較,以升序為例,如果前面的元素大于后面的元素,則將它們的位置進行交換
  • 第一輪遍歷結(jié)束之后,最大的元素會處于所遍歷范圍的最后一個位置,然后繼續(xù)下一輪遍歷
  • 每輪都會固定一個元素,直到所有元素都被固定,因此會執(zhí)行 n - 1輪,n 為元素的個數(shù),也就是數(shù)組(切片)的長度。為什么會是 n - 1 而不是 n,因為到了第 n 輪,只剩下最后一個元素沒有被固定,沒有元素可以和它進行比較了,因此第 n 輪可以忽略。

圖片演示

第一輪遍歷 [4, 2, 1, 3]

  • i = 0 時,比較第 i 個元素 4 與第 i + 1 個元素 2 的大小,因為 nums[i] > num[i+1],也就是 4 > 2,因此交換它們的位置。
  • i = 1 時,4 > 1,互換位置。
  • i = 2 時,4 > 3,互換位置。最大值 4 被交換到最后一個位置,此時所有元素都參與比較過了,結(jié)束第一輪遍歷,執(zhí)行下一輪遍歷。

第二輪遍歷 [2, 1, 3, 4]

  • i = 0 時,2 > 1,互換位置。
  • i = 1 時,2 < 3,不做交換。次大值 3 被交換到 4 的左邊,此時所有元素都參與比較過了,結(jié)束第二輪遍歷,執(zhí)行下一輪遍歷。

第三輪遍歷 [1, 2, 3, 4]

  • i = 0 時,1 < 2,不做交換。此時所有元素都參與比較過了,結(jié)束第三輪遍歷,
  • 執(zhí)行了 n - 1 輪遍歷,n 為數(shù)組的長度,n - 1個元素被交換到正確的位置,第 n 輪遍歷時,只剩最后一個元素,因此不用繼續(xù)進行。

普通的冒泡排序算法

import "fmt"

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

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

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

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

值得注意的一個地方是第二層循環(huán)的條件 j < len(nums)-i-1,為什么會減去 i,因為每輪遍歷結(jié)束之后,都會有一個元素被固定到后面,因此再進行下一輪的時候,那個元素?zé)o須再進行比較。

算法遍歷次數(shù)為 n -1,每次遍歷時元素比較的次數(shù)依次為 n - 1、n - 2、n - 3、···、3、2、1,將所有次數(shù)求和 = 1 + 2 + 3 + ··· + n - 2 + n - 1= n - 1 * (n - 1 + 1) / 2 = (n² - 1) / 2,因此時間復(fù)雜度為 O(n²)。

優(yōu)化算法

上述例子中,對數(shù)組 [4,2,1,3] 進行排序,我們來看看對數(shù)組 [4,2,1,3,5] 進行排序,打印數(shù)組排序的變化過程中:

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

不難看出,第三輪與第四輪遍歷過程中,都沒有進行元素交換位置的操作,對此我們可以推出一個結(jié)論,如果在一輪遍歷中,沒有進行元素交換位置的操作,那么此時數(shù)組的里所有元素都處于正確位置。 根據(jù)這個結(jié)論,我們可以對算法進行優(yōu)化:

import "fmt"

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

func BestBubbleSort(nums [5]int) {
    isSwapped := true
    for isSwapped {
        isSwapped = false
        for i := 0; i < len(nums)-1; i++ {
            if nums[i] > nums[i+1] {
                nums[i], nums[i+1] = nums[i+1], nums[i]
                isSwapped = true
            }
        }
        fmt.Println("遍歷后的數(shù)組:", nums)
    }
    fmt.Println("--------------------------------")
    fmt.Println("排序后的數(shù)組:", nums)
}

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

原數(shù)組: 
--------------------------------
遍歷后的數(shù)組: [2 1 3 4 5]
遍歷后的數(shù)組: [1 2 3 4 5]
遍歷后的數(shù)組: [1 2 3 4 5]
--------------------------------
排序后的數(shù)組: [1 2 3 4 5]

  • 定義交換的標(biāo)記變量 isSwapper,作為第一層循環(huán)的條件,每輪遍歷開始之后,將標(biāo)記變量 isSwapper 賦值為 false,如果在比較的過程中發(fā)生元素交換,則將標(biāo)記變量 isSwapper 賦值為 true。直到 isSwapperfalse 時,數(shù)組的里所有元素都處于正確的位置,此時可以結(jié)束遍歷了。
  • 根據(jù)執(zhí)行結(jié)果可知,相比普通的算法,優(yōu)化后的算法少了一輪遍歷,這只是在數(shù)組元素少的情況下,如果在數(shù)組元素多的情況下,對比結(jié)果會更明顯。
  • 如果數(shù)組為 [5,1,2,3,4],那么算法只會遍歷一輪,就能得到正確的排序結(jié)果。因此優(yōu)化后的算法,最好的情況下時間復(fù)雜度為 O(N),最壞的情況下仍為 O(N²)。

小結(jié)

本文首先對冒泡排序進行簡單的介紹,然后通過圖片演示冒泡排序的思路。普通冒泡排序算法一共要遍歷 n - 1 輪,由測試用例 [4 2 1 3 5] 的結(jié)果可以推斷出 如果在一輪遍歷中,沒有進行元素交換位置的操作,那么此時數(shù)組的里所有元素都處于正確位置。 根據(jù)這個結(jié)論,對算法進行優(yōu)化,優(yōu)化后的算法,最好的情況下時間復(fù)雜度為 O(N)。

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

相關(guān)文章

  • golang 中strings包的Replace的使用說明

    golang 中strings包的Replace的使用說明

    這篇文章主要介紹了golang 中strings包的Replace的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go語言中關(guān)于set的實現(xiàn)思考分析

    Go語言中關(guān)于set的實現(xiàn)思考分析

    Go?開發(fā)過程中有時我們需要集合(set)這種容器,但?Go?本身未內(nèi)置這種數(shù)據(jù)容器,故常常我們需要自己實現(xiàn),下面我們就來看看具體有哪些實現(xiàn)方法吧
    2024-01-01
  • golang搭建靜態(tài)web服務(wù)器的實現(xiàn)方法

    golang搭建靜態(tài)web服務(wù)器的實現(xiàn)方法

    這篇文章主要介紹了golang搭建靜態(tài)web服務(wù)器的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Go語言中JSON文件的讀寫操作

    Go語言中JSON文件的讀寫操作

    本文主要介紹了Go語言JSON文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 用Go+Redis實現(xiàn)分布式鎖的示例代碼

    用Go+Redis實現(xiàn)分布式鎖的示例代碼

    在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問和處理 , 那就需要分布式鎖,本文主要介紹了用Go+Redis實現(xiàn)分布式鎖的示例代碼,感興趣的可以了解一下
    2021-12-12
  • go語言中匿名函數(shù)的作用域陷阱詳解

    go語言中匿名函數(shù)的作用域陷阱詳解

    GO語言的匿名函數(shù)(anonymous?function),其實就是閉包.是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,下面這篇文章主要給大家介紹了關(guān)于go語言中匿名函數(shù)作用域陷阱的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • GO的鎖和原子操作的示例詳解

    GO的鎖和原子操作的示例詳解

    這篇文章主要為大家詳細介紹了Go語言中鎖和原子操作的相關(guān)資料,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2023-02-02
  • GO語言對數(shù)組切片去重的實現(xiàn)

    GO語言對數(shù)組切片去重的實現(xiàn)

    本文主要介紹了GO語言對數(shù)組切片去重的實現(xiàn),主要介紹了幾種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Golang執(zhí)行cmd命令行的方法

    Golang執(zhí)行cmd命令行的方法

    本文主要介紹了Golang執(zhí)行cmd命令行的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang中的godoc使用簡介(推薦)

    Golang中的godoc使用簡介(推薦)

    Godoc是go語言的文檔化工具,類似于文檔化工具godoc,類似于Python的Docstring和Java的Javadoc,這篇文章主要介紹了Golang中的godoc使用簡介,需要的朋友可以參考下
    2022-10-10

最新評論

门源| 沙河市| 东阿县| 长沙市| 和林格尔县| 张家港市| 石城县| 阿合奇县| 通道| 祁东县| 贵德县| 合川市| 伊通| 青田县| 安平县| 海城市| 牟定县| 若尔盖县| 桐柏县| 嘉义市| 扶绥县| 岳西县| 同德县| 东海县| 盐亭县| 乌海市| 慈利县| 祥云县| 公安县| 府谷县| 津南区| 宝山区| 阳谷县| 札达县| 伊春市| 威海市| 江门市| 阳江市| 双牌县| 大悟县| 丰城市|