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)題及解決方法
在之前的文章中分別介紹了使用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
深入理解gorm如何和數(shù)據(jù)庫(kù)建立連接
這篇文章主要為大家詳細(xì)介紹了gorm如何和數(shù)據(jù)庫(kù)建立連接,文中的示例代碼講解詳細(xì),對(duì)我們深入了解GO語(yǔ)言有一定的幫助,需要的小伙伴可以參考下2023-11-11
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)與高效操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
手把手教你如何在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)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
使用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

