冒泡排序
从左到右依次比较两个相邻元素,如果左边元素大于右边元素,就将两者交换;如果左边元素小于等于右边元素,不进行任何操作。
Version1
package main
import "fmt"
func main() {
slice := []int{
7, 5, 8, 4, 3, 2, 6, 9, 1}
//执行次数
for i := 0; i < len(slice)-1; i++ {
//比较次数
for j := 0; j < len(slice)-1-i; j++ {
//大于表示升序,小于表示降序
if slice[j] > slice[j+1] {
slice[j], slice[j+1] = slice[j+1], slice[j]
}
}
}
fmt.Println(slice)
}
Version 2:
增加标志位表示切片已经排好序。当flag为true时,直接跳出循环, 也就是当数组接近升序排列时,可以减少循环次数。
package main
import "fmt"
func main() {
slice := []int{
7, 5, 8, 4, 3, 2, 6, 9, 1}
for i := 0; i < len(slice)-1; i++ {
var flag = true
for j := 0; j < len(slice)-1-i; j++ {
if slice[j] > slice[j+1] {
slice[j], slice[j+1] = slice[j+1], slice[j]
flag = false
}
}
if flag {
break
}
}
fmt.Println(slice)
}
选择排序
假设数组中第 1 个元素最小,然后让剩余的 N - 1 个元素依次和数组第 1 个元素进行比较,如果比第 1 个元素小,那么就进行交换。然后第2个就是第2小的数,以此类推
Version1:
package main
import "fmt"
func main() {
slice := []int{
7, 5, 8, 4, 3, 2, 6,