这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
- 冒泡排序
冒泡排序的基本思想:基本思想是对所有相邻记录的关键字值进行比效,如果是逆顺(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)
}
- 选择排序
选择排序的基本思想:选择排序(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)
}
- 插入排序
插入排序(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)
}
本人小白一枚,以上如有错误或者建议请指正。