日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go語言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解_Golang

作者:宇宙之一粟 ? 更新時(shí)間: 2022-10-23 編程語言

選擇排序

選擇排序(selection?sort)是一種原地(in-place)排序算法,適用于數(shù)據(jù)量較少的情況。由于選擇操作是基于鍵值的且交換操作只在需要時(shí)才執(zhí)行,所以選擇排序長(zhǎng)用于數(shù)值較大和鍵值較小的文件。

思想:

對(duì)一個(gè)數(shù)組進(jìn)行排序,從未排序的部分反復(fù)找到最小的元素,并將其放在開頭。

給定長(zhǎng)度為 nnn 的序列和位置索引i=0 的數(shù)組,選擇排序?qū)ⅲ?/p>

  • 遍歷一遍序列,尋找序列中的最小值。在 [i...n?1] 范圍內(nèi)找出最小值 minValue 的位置 minIndex
  • 用當(dāng)前位置的值交換最小值。第 i 項(xiàng)的值與交換 minIndex 的值交換,swap(nums[i],nums[minIndex])
  • 對(duì)所有元素重復(fù)上述過程,直到整個(gè)序列排序完成。將下限 iii 增加1,并重復(fù)步驟 1 直到 i=n?2。

偽代碼:

func selectionSort(nums []int, length int) {
  for i := 0; i < length-1; i++ { // O(N)
    minValue = nums[minIdx] // O(N)
    swap(nums[i], nums[minIndex]); // O(1), X may be equal to L (no actual swap)
  }
}

動(dòng)畫演示

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

package main
import "fmt"
func main() {
  unsorted := []int{40, 13, 20, 8, 12, 10, 27}
  length := len(unsorted)
  selectionSort(unsorted, length)
  for i := 0; i < length; i++ {
    fmt.Printf("%d\t", unsorted[i])
  }
}
func selectionSort(nums []int, length int) {
  var minIdx int // 被選擇的最小的值的位置
  for i := 0; i < length-1; i++ {
    minIdx = i
    // 每次循環(huán)的第一個(gè)元素為最小值保存
    var minValue = nums[minIdx]
    for j := i; j < length-1; j++ {
      if minValue > nums[j+1] {
        minValue = nums[j+1]
        minIdx = j + 1
      }
    }
    // 如果最小值的位置改變,將當(dāng)前的最小值位置保存
    if i != minIdx {
      var temp = nums[i]
      nums[i] = nums[minIdx]
      nums[minIdx] = temp
    }
  }
}

運(yùn)行結(jié)果為:

[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Go 數(shù)據(jù)結(jié)構(gòu)\選擇排序\main.go"\
8 10 12 13 20 27 40

總結(jié)

選擇排序的優(yōu)點(diǎn):

  • 易于實(shí)現(xiàn),容易理解
  • 原地排序(不需要額外的存儲(chǔ)空間),即 空間復(fù)雜度為 O(1)O(1)O(1)

缺點(diǎn):

  • 擴(kuò)展性較差
  • 時(shí)間復(fù)雜度為 O(n2)O(n^2)O(n2)

穩(wěn)定性:

  • 選擇排序是不穩(wěn)定的排序算法。

原文鏈接:https://juejin.cn/post/7042671726114635812

欄目分類
最近更新