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

Golang實(shí)現(xiàn)常見(jiàn)排序算法的示例代碼

 更新時(shí)間:2022年05月17日 15:24:47   作者:飯米粒  
現(xiàn)在的面試真的是越來(lái)越卷了,算法已經(jīng)成為了面試過(guò)程中必不可少的一個(gè)環(huán)節(jié),你如果想進(jìn)稍微好一點(diǎn)的公司,算法是必不可少的一個(gè)環(huán)節(jié)。本文為大家準(zhǔn)備了Golang實(shí)現(xiàn)常見(jiàn)排序算法的示例代碼,需要的可以參考一下

前言

現(xiàn)在的面試真的是越來(lái)越卷了,算法已經(jīng)成為了面試過(guò)程中必不可少的一個(gè)環(huán)節(jié),你如果想進(jìn)稍微好一點(diǎn)的公司,「算法是必不可少的一個(gè)環(huán)節(jié)」。那么如何學(xué)習(xí)算法呢?很多同學(xué)的第一反應(yīng)肯定是去letcode上刷題,首先我并不反對(duì)刷題的方式,但是對(duì)于一個(gè)沒(méi)有專(zhuān)門(mén)學(xué)習(xí)過(guò)算法的同學(xué)來(lái)說(shuō),刷題大部分是沒(méi)什么思路的,花一個(gè)多小時(shí)暴力破解一道題意義也不大,事后看看別人比較好的解法大概率也記不住,所以我覺(jué)得「專(zhuān)門(mén)針對(duì)算法進(jìn)行一些簡(jiǎn)單的訓(xùn)練」是很有必要的,正好我自己最近也在學(xué)習(xí),同時(shí)把學(xué)習(xí)成果同步更新在公眾號(hào)上,可能會(huì)更很多期,希望能幫助到你。另外最近很多同學(xué)也都在學(xué)習(xí)go,所以我就用go代碼演示算法。今天咱們閑話(huà)不用多說(shuō),就從最簡(jiǎn)單的開(kāi)始。

五種基礎(chǔ)排序算法對(duì)比

五種基礎(chǔ)排序算法對(duì)比

1、冒泡排序

算法描述

  • 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè)。
  • 對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù)。
  • 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
  • 重復(fù)步驟1~3,直到排序完成。

代碼演示

func bubbleSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for e := len(arr) - 1; e > 0; e-- {
  for i := 0; i < e; i++ {
   if arr[i] > arr[i+1] {
    Swap(arr, i, i+1)  //交換元素
   }
  }
 }
 return arr
}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

2、選擇排序

算法描述

n個(gè)記錄的直接選擇排序可經(jīng)過(guò)n-1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:

  • 將假想墻放置在數(shù)字列表最左側(cè),墻的左側(cè)為已排序子列表,右側(cè)為未排序子列表。
  • 找出(選擇)未排序子列表中的最小(或最大)元素。
  • 把選擇的元素與未排序列表中第一個(gè)元素進(jìn)行交換。
  • 將假想墻向右移動(dòng)一個(gè)位置。
  • 反復(fù)執(zhí)行 2 至 4 步操作,直至整個(gè)數(shù)字列表排序完成(需要 n - 1 輪)。

代碼演示

func selectSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for i := 0; i < len(arr); i++ {
  var minIndex int = i
  for j := i + 1; j < len(arr); j++ {
   if arr[j] < arr[minIndex] {
    minIndex = j
   }
  }
  arr = Swap(arr, i, minIndex)
 }
 return arr

}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

3、插入排序

算法描述

一般來(lái)說(shuō),插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:

  • 從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序。
  • 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描。
  • 如果該元素(已排序)大于新元素,將該元素移到下一位置。
  • 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;將新元素插入到該位置后;
  • 重復(fù)步驟2~5。

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

func insertSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 for i := 1; i < len(arr); i++ {
  for j := i - 1; j >= 0; j-- {
   if arr[j] > arr[j+1] {
    Swap(arr, j, j+1)
   }
  }
 }
 return arr
}
func Swap(arr []int, i, j int) []int {
 temp := arr[j]
 arr[j] = arr[i]
 arr[i] = temp
 return arr
}

4、快速排序

算法描述

快速排序的基本思想:通過(guò)一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。

  • 從數(shù)列中挑出一個(gè)元素,稱(chēng)為 “基準(zhǔn)”(pivot)。
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱(chēng)為分區(qū)(partition)操作。
  • 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

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

//快速排序
func quickSort(arr []int) []int {
 if len(arr) <= 1 {
  return arr
 }
 middle := arr[0]
 var left []int
 var right []int
 for i := 1; i < len(arr); i++ {
  if arr[i] > middle {
   right = append(right, arr[i])
  } else {
   left = append(left, arr[i])
  }
 }
 middle_s := []int{middle}
 left = quickSort(left)
 right = quickSort(right)
 arr = append(append(left, middle_s...), right...)
 return arr
}

以上就是Golang實(shí)現(xiàn)常見(jiàn)排序算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Golang排序算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于go-micro與其它gRPC框架之間的通信問(wèn)題及解決方法

    關(guān)于go-micro與其它gRPC框架之間的通信問(wèn)題及解決方法

    在之前的文章中分別介紹了使用gRPC官方插件和go-micro插件開(kāi)發(fā)gRPC應(yīng)用程序的方式,都能正常走通。不過(guò)當(dāng)兩者混合使用的時(shí)候,互相訪(fǎng)問(wèn)就成了問(wèn)題,下面通過(guò)本文給大家講解下go-micro與gRPC框架通信問(wèn)題,一起看看吧
    2022-04-04
  • Golang中channel的原理解讀(推薦)

    Golang中channel的原理解讀(推薦)

    channel主要是為了實(shí)現(xiàn)go的并發(fā)特性,用于并發(fā)通信的,也就是在不同的協(xié)程單元goroutine之間同步通信。接下來(lái)通過(guò)本文給大家介紹Golang中channel的原理解讀,感興趣的朋友一起看看吧
    2021-10-10
  • Golang之defer 延遲調(diào)用操作

    Golang之defer 延遲調(diào)用操作

    這篇文章主要介紹了Golang之defer 延遲調(diào)用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 深入理解gorm如何和數(shù)據(jù)庫(kù)建立連接

    深入理解gorm如何和數(shù)據(jù)庫(kù)建立連接

    這篇文章主要為大家詳細(xì)介紹了gorm如何和數(shù)據(jù)庫(kù)建立連接,文中的示例代碼講解詳細(xì),對(duì)我們深入了解GO語(yǔ)言有一定的幫助,需要的小伙伴可以參考下
    2023-11-11
  • golang中protobuf的使用詳解

    golang中protobuf的使用詳解

    protobuf是Google公司提出的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,常用于結(jié)構(gòu)化數(shù)據(jù)的序列化,具有語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展性特性,常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場(chǎng)景,下面我們就來(lái)看看golang中protobuf的具體使用吧
    2023-10-10
  • go語(yǔ)言interface接口繼承多態(tài)示例及定義解析

    go語(yǔ)言interface接口繼承多態(tài)示例及定義解析

    這篇文章主要為大家介紹了go語(yǔ)言interface接口繼承多態(tài)示例及定義解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    這篇文章主要介紹了Go語(yǔ)言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 手把手教你如何在Goland中創(chuàng)建和運(yùn)行項(xiàng)目

    手把手教你如何在Goland中創(chuàng)建和運(yùn)行項(xiàng)目

    歡迎來(lái)到本指南!我們將手把手地教您在Goland中如何創(chuàng)建、配置并運(yùn)行項(xiàng)目,通過(guò)簡(jiǎn)單的步驟,您將迅速上手這款強(qiáng)大的集成開(kāi)發(fā)環(huán)境(IDE),輕松實(shí)現(xiàn)您的編程夢(mèng)想,讓我們一起開(kāi)啟這段精彩的旅程吧!
    2024-02-02
  • 解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問(wèn)題

    解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問(wèn)題

    這篇文章主要介紹了解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 使用go xorm來(lái)操作mysql的方法實(shí)例

    使用go xorm來(lái)操作mysql的方法實(shí)例

    今天小編就為大家分享一篇關(guān)于使用go xorm來(lái)操作mysql的方法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04

最新評(píng)論

屏东县| 衢州市| 邮箱| 家居| 金门县| 仁怀市| 涡阳县| 晋江市| 北碚区| 晋城| 麟游县| 清新县| 正镶白旗| 班玛县| 德格县| 军事| 黑河市| 比如县| 城步| 古浪县| 沙雅县| 南开区| 齐齐哈尔市| 扎兰屯市| 贵溪市| 神农架林区| 松阳县| 红原县| 旺苍县| 龙陵县| 临海市| 云阳县| 天柱县| 克山县| 关岭| 阆中市| 延津县| 乡宁县| 綦江县| 永仁县| 盐源县|