GO语言数据结构与算法之排序 | 青训营笔记

73 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

  1. 冒泡排序

冒泡排序的基本思想:基本思想是对所有相邻记录的关键字值进行比效,如果是逆顺(a[j]>a[j+1]),则将其交换,最终达到有序化。

package main

import (
   "fmt"
)

func bubbleSort(arr *[7]int) {

   fmt.Println("排序前arr=", *arr)

   for i := 0; i < len(arr) - 1; i++ {
      for j := 0; j < len(arr) - 1 - i; j++ {
         if arr[j] < arr[j + 1] {
            arr[j], arr[j + 1] = arr[j + 1], arr[j]
         }
      }
      fmt.Printf("冒泡排序第%d次后arr=%v \n", i + 1, *arr)
   }
   fmt.Println("冒泡排序后arr=", *arr)
} 

func main() {

   arr := [7]int{30, 0, 10, 18, 28, 15, 50}

   bubbleSort(&arr)

   fmt.Println("main arr=", arr)
}
  1. 选择排序

选择排序的基本思想:选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与 R[0]交换,第二次从 R[1]~R[n-1]中选取最小值,与 R[1]交换,第三次从 R[2]~R[n-1]中选取最小值,与 R[2]交换,…,第 i 次从 R[i-1]~R[n-1]中选取最小值,与 R[i-1]交换,…, 第 n-1 次从R[n-2]~R[n-1]中选取最小值,与 R[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。

package main

import (
   "fmt"
)

func selectSort(arr *[5]int) {
   fmt.Println("arr排序前=", *arr)

   for j := 0; j < len(arr) - 1; j++ {
      max := arr[j]  //假设第一个数就是最大的
      maxIndex := j
      for i := j + 1; i < len(arr); i++ {
      if max < arr[i] {  //找到真正的最大的
         max = arr[i]
         maxIndex = i
      }
   }
   //for循环结束后,会找到真正最大的数及其下标
   //交换
   if maxIndex != j {
      arr[j], arr[maxIndex] = arr[maxIndex], arr[j]
   }
   fmt.Println("交换后arr=", *arr)
   }
   
   

}

func main() {

   arr := [5]int{0, 100, 55, 888, 999}

   selectSort(&arr)

   fmt.Println("main arr=", arr)
}
  1. 插入排序

插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表, 开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

package main

import (
   "fmt"
)

func insertSort(arr *[5]int) {
   fmt.Println("排序前arr=", *arr)

   for i := 1; i < len(arr); i++ {
      insertVal := arr[i]
      insertIndex := i - 1

      for insertIndex >= 0 && arr[insertIndex] < insertVal {
         arr[insertIndex + 1] = arr[insertIndex]
         insertIndex--
      }
      if insertIndex != i {
         arr[insertIndex + 1] = insertVal
      }
      fmt.Printf("插入排序第%d次 arr=%v \n", i, *arr)
   }
   fmt.Println("插入排序后", *arr)

}

func main() {

   arr := [5]int{30, 0, 10, 18, 28}

   insertSort(&arr)

   fmt.Println("main arr=", arr)
}

本人小白一枚,以上如有错误或者建议请指正。