欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

1、冒泡排序

算法描述

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

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

算法描述

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

  • 從第一個(gè)元素開始,該元素可以認(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、快速排序

算法描述

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

  • 從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot)。
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(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)常見排序算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Golang排序算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論