自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

常見排序算法的Golang 實現(xiàn)

開發(fā) 前端
現(xiàn)在的面試真的是越來越卷了,算法已經(jīng)成為了面試過程中必不可少的一個環(huán)節(jié),你如果想進(jìn)稍微好一點的公司,「算法是必不可少的一個環(huán)節(jié)」。

前言

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

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

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

1、冒泡排序

算法描述

  • 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個。
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對,這樣在最后的元素應(yīng)該會是最大的數(shù)。
  • 針對所有的元素重復(fù)以上的步驟,除了最后一個。
  • 重復(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個記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:

  • 將假想墻放置在數(shù)字列表最左側(cè),墻的左側(cè)為已排序子列表,右側(cè)為未排序子列表。
  • 找出(選擇)未排序子列表中的最小(或最大)元素。
  • 把選擇的元素與未排序列表中第一個元素進(jìn)行交換。
  • 將假想墻向右移動一個位置。
  • 反復(fù)執(zhí)行 2 至 4 步操作,直至整個數(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、插入排序

算法描述

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

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

代碼實現(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、快速排序

算法描述

快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟毩⒌膬刹糠郑渲幸徊糠钟涗浀年P(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個序列有序。

  • 從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”(pivot)。
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作。
  • 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(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
}
責(zé)任編輯:姜華 來源: 程序員小飯
相關(guān)推薦

2022-11-01 18:29:25

Go語言排序算法

2024-08-30 14:34:00

2017-11-22 14:20:07

前端JavaScript排序算法

2021-02-26 05:29:11

排序算法數(shù)組

2021-02-22 07:29:07

算法初級排序

2023-12-04 07:49:06

選擇排序排序算法

2011-02-17 09:11:40

JavaScript算法

2020-05-08 11:13:28

Python數(shù)據(jù)技術(shù)

2021-09-30 07:57:13

排序算法面試

2021-09-04 23:40:53

算法程序員前端

2022-09-24 09:03:55

前端單元測試冒泡排序

2016-09-30 14:23:16

數(shù)據(jù)結(jié)構(gòu)算法八大排序算法

2021-11-10 09:17:18

程序員排序算法搜索算法

2023-02-09 07:39:01

2021-03-04 07:24:28

排序算法優(yōu)化

2009-11-17 11:06:37

PHP排序

2015-10-08 09:08:50

Python實現(xiàn)

2012-06-27 15:33:30

Java排序算法

2009-08-19 09:42:34

F#并行排序算法

2023-05-08 07:55:05

快速排序Go 語言
點贊
收藏

51CTO技術(shù)棧公眾號