Golang語(yǔ)言常用算法1

在學(xué)習(xí)golang語(yǔ)言燃少,文檔看的實(shí)在是乏味,就想著把常用的算法做個(gè)實(shí)現(xiàn)铃在,邊寫變學(xué)習(xí)阵具,想來(lái)效果還是不錯(cuò)的定铜!

1. 堆排序

package main
    
import "fmt"

func buildHeap(array []int, length int) {
        var i, j int;
        for i = 1; i < length; i = i + 1 {
            for j = i; j > 0 && array[j] > array[(j-1)/2]; j = (j - 1)/2  {
                array[j], array[(j-1)/2] = array[(j-1)/2], array[j]  
            }
        }
    }

func heapSort(array []int, length int) {
        array[0], array[length - 1] = array[length - 1], array[0]
        if length <= 2 {
            return
        }
        i, j:= 0, 0
        for  {
            j = 2 * i + 1
            if j + 1 < length - 1 {
                if array[j] < array[j + 1] {
                    j = j + 1
                }
            } else if j >= length -1 {
                break
            }   
            array[i], array[j] = array[j], array[i]
            i = j
        }
        heapSort(array, length - 1)
    }
func main() {
        primes := [6]int{3, 11, 5, 2, 13, 7}
        fmt.Println("orginal", primes)
        buildHeap(primes[:], len(primes))
        fmt.Println("Max heap", primes)
        heapSort(primes[:], len(primes))
        fmt.Println("after sorting", primes)
}

    /**
        out:
            orginal [3 11 5 2 13 7]
            Max heap [13 11 7 2 3 5]
            after sorting [2 3 5 7 11 13]
    
    **/

2.冒泡排序

package main

import "fmt"

func BubbleSort(vector []int) {
    fmt.Println("BubbleSort")
    fmt.Println(vector)
    for i := 0; i < len(vector); i++ {
        tag := true // 為了剪枝
        // 每一趟將最大的數(shù)冒泡
        for j := 0; j < len(vector)-i-1; j++ {
            if vector[j] > vector[j+1] { /*vector[j] < vector[j+1]*/
                temp := vector[j]
                vector[j] = vector[j+1]
                vector[j+1] = temp
                tag = false
            }
        }
        if tag {
            break //0~len(vector)-i沒(méi)有發(fā)生交換說(shuō)明已經(jīng)有序
        }
        fmt.Println(vector)
    }
}

func main() {
        primes := [6]int{3, 11, 5, 2, 13, 7}
        fmt.Println("orginal", primes)
        BubbleSort(primes[:])
        fmt.Println("after sorting", primes)
}
  /**
    out:
        orginal [3 11 5 2 13 7]
        BubbleSort
        [3 11 5 2 13 7]
        [3 5 2 11 7 13]
        [3 2 5 7 11 13]
        [2 3 5 7 11 13]
        after sorting [2 3 5 7 11 13]

  **/
    

3. 插入排序

package main

import "fmt"

func InsertSort(vector []int) {
    fmt.Println("InsertSort")
    fmt.Println(vector)
    for i := 1; i < len(vector); i++ {
        // 每一趟不滿足條件就選擇i為哨兵保存,將哨兵插入0~i-1有序序列(0~i-1始終是有序的)
        if vector[i] < vector[i-1] { /*vector[i] > vector[i-1]*/
            temp := vector[i]
            //后移直到找到哨兵合適的位置
            j := i - 1
            for ; j >= 0 && vector[j] > temp; j-- { /*vector[j] < temp*/
                vector[j+1] = vector[j]
            }
            //插入位置前后都是有序的,最后也是有序的
            vector[j+1] = temp
        }
        fmt.Println(vector)
    }
}
func main() {
    primes := [6]int{3, 11, 5, 2, 13, 7}
    fmt.Println("orginal", primes)
    InsertSort(primes[:])
    fmt.Println("after sorting", primes)
}

/**
    out:
        orginal [3 11 5 2 13 7]
        InsertSort
        [3 11 5 2 13 7]
        [3 11 5 2 13 7]
        [3 5 11 2 13 7]
        [2 3 5 11 13 7]
        [2 3 5 11 13 7]
        [2 3 5 7 11 13]
        after sorting [2 3 5 7 11 13]
**/

    

4. 選擇排序

package main

import "fmt"

func SelectSort(vector []int) {
    fmt.Println("SelectSort")
    fmt.Println(vector)
    for i := 0; i < len(vector); i++ {
        // 選擇最小的元素
        k := i
        for j := i + 1; j < len(vector); j++ {
            if vector[k] > vector[j] {
                k = j
            }
        }
        // 交換
        if k != i {
            temp := vector[i]
            vector[i] = vector[k]
            vector[k] = temp
        }
        fmt.Println(vector)
    }
}
func main() {
    primes := [6]int{3, 11, 5, 2, 13, 7}
    fmt.Println("orginal", primes)
    SelectSort(primes[:])
    fmt.Println("after sorting", primes)
}

/**
    out:
        orginal [3 11 5 2 13 7]
        SelectSort
        [3 11 5 2 13 7]
        [2 11 5 3 13 7]
        [2 3 5 11 13 7]
        [2 3 5 11 13 7]
        [2 3 5 7 13 11]
        [2 3 5 7 11 13]
        [2 3 5 7 11 13]
        after sorting [2 3 5 7 11 13]
**/

5. 二元選擇排序

package main

import "fmt"

func BinarySelectSort(vector []int) {
    fmt.Println("SelectSort")
    fmt.Println(vector)
    n := len(vector)
    for i := 0; i < n/2; i++ {
        // 選擇最小的元素和最大元素
        k := i
        t := n - i - 1
        for j := i + 1; j <= n-i-1; j++ {
            if vector[k] > vector[j] {
                k = j
            }
            if vector[t] < vector[j] {
                t = j
            }
        }
        // 交換
        if k != i {
            temp := vector[i]
            vector[i] = vector[k]
            vector[k] = temp
        }
        if t != n-i-1 {
            temp := vector[n-i-1]
            vector[n-i-1] = vector[t]
            vector[t] = temp
        }
        fmt.Println(vector)
    }
}
func main() {
    primes := [6]int{3, 11, 5, 2, 13, 7}
    fmt.Println("orginal", primes)
    BinarySelectSort(primes[:])
    fmt.Println("after sorting", primes)
}

/**
    out:
        orginal [3 11 5 2 13 7]
        SelectSort
        [3 11 5 2 13 7]
        [2 11 5 3 7 13]
        [2 3 5 11 7 13]
        [2 3 5 11 7 13]
        after sorting [2 3 5 11 7 13]
**/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牲览,一起剝皮案震驚了整個(gè)濱河市墓陈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌第献,老刑警劉巖贡必,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異庸毫,居然都是意外死亡赊级,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門岔绸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人橡伞,你說(shuō)我怎么就攤上這事盒揉。” “怎么了兑徘?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵刚盈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挂脑,道長(zhǎng)藕漱,這世上最難降的妖魔是什么欲侮? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肋联,結(jié)果婚禮上威蕉,老公的妹妹穿的比我還像新娘。我一直安慰自己橄仍,他們只是感情好韧涨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侮繁,像睡著了一般虑粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪哩,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天娩贷,我揣著相機(jī)與錄音,去河邊找鬼锁孟。 笑死彬祖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罗岖。 我是一名探鬼主播断盛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蔚舀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卸夕,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搀缠,沒(méi)想到半個(gè)月后缰泡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弱左,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年窄陡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拆火。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跳夭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出们镜,到底是詐尸還是另有隱情币叹,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布模狭,位于F島的核電站颈抚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚼鹉。R本人自食惡果不足惜贩汉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一驱富、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匹舞,春花似錦褐鸥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至又憨,卻和暖如春翠霍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蠢莺。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工寒匙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躏将。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓锄弱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親祸憋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子会宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一. 寫在前面 要學(xué)習(xí)算法,“排序”是一個(gè)回避不了的重要話題蚯窥,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后掸鹅,今天我們終于可...
    Leesper閱讀 2,520評(píng)論 0 40
  • 面試中常用的幾個(gè)基本算法整理記錄(二) 無(wú)意中看到了面試中的 10 大排序算法總結(jié)原文地址記錄一下,方便查找拦赠。 查...
    190CM閱讀 1,746評(píng)論 1 13
  • 概述 排序有內(nèi)部排序和外部排序巍沙,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大荷鼠,一次不能容納全部...
    蟻前閱讀 5,164評(píng)論 0 52
  • 前言 本篇文章基本是從常用排序算法總結(jié)(一)快速排序引申而來(lái)句携,其中大部分代碼和描述都來(lái)自這兩篇文章。 時(shí)間復(fù)雜度 ...
    王三的貓阿德閱讀 1,066評(píng)論 0 1
  • 概述:排序有內(nèi)部排序和外部排序允乐,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序矮嫉,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評(píng)論 0 15