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

Go語言排序算法之插入排序與生成隨機(jī)數(shù)詳解

 更新時間:2017年11月03日 08:44:33   作者:Corwien  
從這篇文章開始將帶領(lǐng)大家學(xué)習(xí)Go語言的經(jīng)典排序算法,比如插入排序、選擇排序、冒泡排序、希爾排序、歸并排序、堆排序和快排,二分搜索,外部排序和MapReduce等,本文將先詳細(xì)介紹插入排序,并給大家分享了go語言生成隨機(jī)數(shù)的方法,下面來一起看看吧。

前言

排序,對于每種編程語言都是要面對的。這里跟大家一起分享golang實(shí)現(xiàn)一些排序算法,并且說明如何生成隨機(jī)數(shù)。下面話不多說了,來一起看看詳細(xì)的介紹吧。

經(jīng)典排序算法

算法的學(xué)習(xí)非常重要,是檢驗(yàn)一個程序員水平的重要標(biāo)準(zhǔn)。學(xué)習(xí)算法不能死記硬背,需要理解其中的思想,這樣才能靈活應(yīng)用到實(shí)際的開發(fā)中。

七大經(jīng)典排序算法

  • 插入排序
  • 選擇排序
  • 冒泡排序
  • 希爾排序
  • 歸并排序
  • 堆排序
  • 快速排序

插入排序

先考慮一個問題:對于長度為n的數(shù)組,前n-1位都是遞增有序的,如何排序?

     1.從第1位至第n-1位遍歷數(shù)組,發(fā)現(xiàn)第n位數(shù)字應(yīng)該放在第k位

     2.把第k位至第n-1位的數(shù)字依次向后挪一位

     3.這樣長度為n的數(shù)組就是遞增有序的了

具體實(shí)現(xiàn)方法:

package main
import "fmt" 

func insertionSort(arr []int) {
  for i := 1; i < len(arr); i++ {
   value := arr[i]

   for j := i - 1; j >= 0; j-- {
    if value < arr[j] {
     arr[j+1], arr[j] = arr[j], value
    } else {
     break
    }

   }
  }

}

func main() {
 arr := []int{6, 5, 4, 3, 2, 1, 0}
 insertionSort(arr)

 fmt.Println("Sorted arr: ", arr)
}

復(fù)雜度:

時間復(fù)雜度:O(n*n)

空間復(fù)雜度:額外空間O(1)

O表達(dá)式(Big O notation)通常用來在計(jì)算機(jī)科學(xué)中表示算法的復(fù)雜度,包括:

時間復(fù)雜度:衡量算法的運(yùn)行時間

空間復(fù)雜度:衡量算法運(yùn)行所占的空間,比如內(nèi)存或硬盤等

一般情況下,O表達(dá)式代表的是最壞情況下的復(fù)雜度。

算法分析也是如此,在n個隨即數(shù)中查找某個數(shù)字,最好的情況是第一個數(shù)字就是,此時時間復(fù)雜度為O(1),若最后一個數(shù)字才是我們要找的,那么時間復(fù)雜度是O(n),這是最壞的情況。而平均運(yùn)行時間是從概率的角度看,若數(shù)字在每一個位置都可能出現(xiàn),則平均查找次數(shù)為n/2次。

平均運(yùn)行時間是所有情況中最有意義的,因?yàn)樗瞧谕倪\(yùn)行時間??涩F(xiàn)實(shí)中,平均運(yùn)行時間很難通過分析得到,一般都是通過運(yùn)行一定數(shù)量的實(shí)驗(yàn)數(shù)據(jù)后估算而來的。而最壞運(yùn)行時間是一種保證,那就是運(yùn)行時間不會再壞了。在應(yīng)用中,這是最重要的需求,通常,除非特別指定,我們提到的運(yùn)行時間都是最壞情況下的運(yùn)行時間。即,時間復(fù)雜度是最壞情況下的時間復(fù)雜度。

常見的算法時間復(fù)雜度由小到大依次為:

O(1)<O(log2n)<O(n)<O(n log2 n)<O(n^2)<O(n^3)<O(2^n)

這里的O就是一般表示復(fù)雜度的一個標(biāo)志,類似計(jì)算復(fù)雜度的函數(shù)名稱一樣。

兩種復(fù)雜度都是一種估算,

估算的方式就是根據(jù)代碼的邏輯,分析出對于復(fù)雜度的公式。

在時間復(fù)雜度上,主要記錄的是帶有變量的循環(huán)。

比如for (i = 0; i < n; i ++) {...}可理解為O(n)

而 x = n + 1; y = x + 1; z = x + y;雖然是三條語句,但是沒有循環(huán)操作,所以理解為O(1)

在空間復(fù)雜度上,主要記錄的是帶有變量的空間申請。

比如int[n] x;可以理解為O(n)

而 int x; int y; int z;雖然是三個變量,但是沒有變化的申請操作,所以理解為O(1)

大O符號是用于描述函數(shù)漸近行為的數(shù)學(xué)符號。既可以表示無窮大漸近也可以表示

無窮小漸近??茨闶怯迷谒惴ㄟ€是描述數(shù)學(xué)函數(shù)估計(jì)中的誤差項(xiàng)

再來看看我們的插入排序:

  • 當(dāng)數(shù)組是逆序的時候,時間復(fù)雜度是O(n*n)
  • 當(dāng)數(shù)組幾乎是有序的時候,時間復(fù)雜度是O(n)

另外插入排序的overhead特別小,可以理解為常數(shù)等于1

在實(shí)際應(yīng)用中,常數(shù)也是一個很重要的因素。有的算法復(fù)雜度低,但是常數(shù)較高;再加上數(shù)據(jù)的特點(diǎn),有時候反而比不上復(fù)雜度更高但是常數(shù)低的算法。

在理解插入排序算法的過程中,應(yīng)該要明白一個算法思想:

  • 把問題分解為子問題
  • 找到問題的初始狀態(tài)
  • 從問題的初始狀態(tài),通過子問題,一步步得到最終的解

實(shí)際應(yīng)用中,要靈活的選擇算法,有幾個重點(diǎn)要考慮的:

  • 復(fù)雜度:包括時間復(fù)雜度,空間復(fù)雜度,常數(shù)等
  • 實(shí)現(xiàn)復(fù)雜度:算法實(shí)現(xiàn)起來很難,不易于測試和維護(hù)的話,也是很大的問題
  • 適用性:在特定的業(yè)務(wù)場景下,是否有更合適的算法?

總的來說,要具體情況具體分析,在滿足業(yè)務(wù)的同時要簡潔的解決問題。

go 生成區(qū)間隨機(jī)數(shù)

// 函 數(shù):生成隨機(jī)數(shù) 
// 概 要: 
// 參 數(shù): 
//  min: 最小值 
//  max: 最大值 
// 返回值: 
//  int64: 生成的隨機(jī)數(shù) 
func RandInt64(min, max int64) int64 { 
 if min >= max || min == 0 || max == 0 { 
  return max 
 } 
 return rand.Int63n(max-min) + min 
} 

參考文章: 【BAT后臺入門】第二課:數(shù)組與排序

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • GoLang channel使用介紹

    GoLang channel使用介紹

    Channel 和 goroutine 的結(jié)合是 Go 并發(fā)編程的大殺器。而 Channel 的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與 select,cancel,timer 等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要梳理一下 channel 的應(yīng)用
    2022-10-10
  • Go語言 go程釋放操作(退出/銷毀)

    Go語言 go程釋放操作(退出/銷毀)

    這篇文章主要介紹了Go語言 go程釋放操作(退出/銷毀),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang中HTTP路由設(shè)計(jì)的使用與實(shí)現(xiàn)

    Golang中HTTP路由設(shè)計(jì)的使用與實(shí)現(xiàn)

    這篇文章主要介紹了Golang中HTTP路由設(shè)計(jì)的使用與實(shí)現(xiàn),為什么要設(shè)計(jì)路由規(guī)則,因?yàn)槁酚梢?guī)則是HTTP的請求按照一定的規(guī)則 ,匹配查找到對應(yīng)的控制器并傳遞執(zhí)行的邏輯,需要的朋友可以參考下
    2023-05-05
  • 在Golang中使用Redis的方法示例

    在Golang中使用Redis的方法示例

    這篇文章主要介紹了在Golang中使用Redis的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總

    夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總

    這篇文章主要8為大家介紹了夯實(shí)Golang基礎(chǔ)之?dāng)?shù)據(jù)類型梳理匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-10-10
  • golang中defer的基本使用教程

    golang中defer的基本使用教程

    go語言中defer可以完成延遲功能,當(dāng)前函數(shù)執(zhí)行完成后再執(zhí)行defer的代碼塊,下面這篇文章主要給大家介紹了關(guān)于golang中defer基本使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 關(guān)于Go語言中的IO操作詳解

    關(guān)于Go語言中的IO操作詳解

    在現(xiàn)代軟件開發(fā)中,高效的輸入輸出(I/O)操作是提高程序性能的關(guān)鍵之一,Go語言提供了豐富的I/O操作接口,使得文件讀寫、網(wǎng)絡(luò)通信等任務(wù)變得簡單而高效,本文介紹了關(guān)于Go語言中的IO操作,需要的朋友可以參考下
    2024-10-10
  • Go語言os包用法詳解

    Go語言os包用法詳解

    本文主要介紹了Go語言os包用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • go語言base64用法實(shí)例

    go語言base64用法實(shí)例

    這篇文章主要介紹了go語言base64用法,實(shí)例分析了Go語言base64編碼的實(shí)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼

    go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼

    本文主要介紹了go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論

开封市| 腾冲县| 崇仁县| 临城县| 安义县| 建瓯市| 老河口市| 克东县| 滦平县| 布拖县| 耒阳市| 土默特右旗| 龙里县| 乳山市| 隆尧县| 宁乡县| 康保县| 临夏县| 冕宁县| 连云港市| 海兴县| 大悟县| 绥中县| 洛南县| 阿拉善盟| 德格县| 高碑店市| 天等县| 张北县| 克山县| 利津县| 麻栗坡县| 宜昌市| 德钦县| 游戏| 绩溪县| 延津县| 万州区| 新化县| 陕西省| 沙湾县|