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

Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解

 更新時(shí)間:2022年08月26日 16:10:31   作者:宇宙之一粟  
這篇文章主要為大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

希爾排序

在插入排序中,在待排序序列的記錄個(gè)數(shù)比較少,而且基本有序,則排序的效率較高。

1959 年,Donald Shell 從“減少記錄個(gè)數(shù)” 和 “基本有序” 兩個(gè)方面對(duì)直接插入排序進(jìn)行了改進(jìn),提出了希爾排序算法。

希爾排序又稱為“縮小增量排序”。即將待排序記錄按下標(biāo)的一定增量分組(減少記錄個(gè)數(shù)),對(duì)每組記錄使用直接插入排序算法排序(達(dá)到基本有序);

隨著增量逐漸減少,每組包含的關(guān)鍵詞越來(lái)越多,當(dāng)增量減至1,整個(gè)序列基本有序,再對(duì)全部記錄進(jìn)行一次直接插入排序。

算法思想

Shell 排序是一種高效的排序算法,基于插入排序算法。這種算法避免了插入排序中的大量移動(dòng),如果較小的值在最右邊,就必須移到最左邊。較小的值在最右邊,必須移到最左邊。

算法步驟:

  • 設(shè)待排序的記錄存儲(chǔ)在數(shù)組 array[1...n]  中,增量序列為 {g1, g2, ..., gt}  , n>g1>g2>...>gt=1 。
  • 第一趟增量 g1, 所有間隔為 g1 的記錄分在一組,對(duì)每組記錄進(jìn)行插入排序。
  • 第二趟取增量 g2,所有間隔為 g2 的記錄分在一組,對(duì)每組記錄進(jìn)行插入排序。
  • 依次進(jìn)行下去,直到所取增量 gt = 1,所有記錄在一組中進(jìn)行插入排序。

圖解算法

假設(shè)我們有一個(gè)數(shù)組: [7, 4, 3, 5, 2, 1, 6] :

第一次希爾排序間隔為3時(shí):

第二次希爾排序間隔為2時(shí):

第三次希爾排序間隔為1時(shí):

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

package main
import "fmt"
func swap(array []int, a int, b int) {
    array[a] = array[a] + array[b]
    array[b] = array[a] - array[b]
    array[a] = array[a] - array[b]
}
func shellSort(array []int, length int) {
    for gap := length / 2; gap > 0; gap = gap / 2 {
        for i := gap; i < length; i++ {
            var j = i
            for {
                if j-gap < 0 || array[j] >= array[j-gap] {
                    break
                }
                swap(array, j, j-gap)
                j = j - gap
            }
        }
    }
}
func main() {
    nums := []int{7, 4, 3, 5, 2, 1, 6}
    length := len(nums)
    shellSort(nums, length)
    for i := 0; i < length; i++ {
        fmt.Println(nums[i])
    }
}

運(yùn)行結(jié)果:

[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Go 數(shù)據(jù)結(jié)構(gòu)\希爾排序\main.go"
1
2
3
4
5
6
7

總結(jié)

空間復(fù)雜度: 希爾排序在分組進(jìn)行插入排序時(shí)使用了一個(gè)輔助空間 j,空間復(fù)雜度為 O(1)O(1)O(1)

穩(wěn)定性: 希爾排序的分組導(dǎo)致不同組間的相同數(shù)字可能會(huì)調(diào)換位置,所以希爾排序是不穩(wěn)定的排序算法。

以上就是Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go 數(shù)據(jù)結(jié)構(gòu)希爾排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang函數(shù)的返回值實(shí)現(xiàn)

    golang函數(shù)的返回值實(shí)現(xiàn)

    本文主要介紹了golang函數(shù)的返回值實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang interface判斷為空nil的實(shí)現(xiàn)代碼

    golang interface判斷為空nil的實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang interface判斷為空nil的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解

    golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解

    這篇文章主要介紹了golang控制結(jié)構(gòu)select機(jī)制及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go語(yǔ)言Select chan用法小結(jié)

    Go語(yǔ)言Select chan用法小結(jié)

    select語(yǔ)句是Go語(yǔ)言中用于處理多個(gè)通道操作的關(guān)鍵字,它允許你在多個(gè)通道上進(jìn)行非阻塞的選擇操作,本文就詳細(xì)介紹一下如何使用,感興趣的可以了解一下
    2023-09-09
  • go語(yǔ)言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    go語(yǔ)言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    這篇文章主要為大家介紹了go語(yǔ)言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 學(xué)會(huì)提升Go語(yǔ)言編碼效率技巧拒絕加班!

    學(xué)會(huì)提升Go語(yǔ)言編碼效率技巧拒絕加班!

    這篇文章主要為大家介紹了Go語(yǔ)言編碼效率提升技巧詳解,學(xué)會(huì)了從此拒絕加班,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)

    本文主要介紹了Gin 框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • go語(yǔ)言使用scp的方法實(shí)例分析

    go語(yǔ)言使用scp的方法實(shí)例分析

    這篇文章主要介紹了go語(yǔ)言使用scp的方法,實(shí)例分析了go語(yǔ)言調(diào)用scp命令的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 初識(shí)Golang?Mutex互斥鎖的使用

    初識(shí)Golang?Mutex互斥鎖的使用

    在學(xué)習(xí)操作系統(tǒng)的時(shí)候,我們應(yīng)該都學(xué)習(xí)過(guò)臨界區(qū)、互斥鎖這些概念,用于在并發(fā)環(huán)境下保證狀態(tài)的正確性。在?Go語(yǔ)言?里面互斥鎖是?sync.Mutex?,我們本篇文章就來(lái)學(xué)習(xí)下為什么要使用互斥鎖、如何使用互斥鎖,以及使用時(shí)的常見(jiàn)問(wèn)題
    2022-10-10
  • Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄

    Golang操作MySql數(shù)據(jù)庫(kù)的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Golang操作MySql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論