插入排序
代码如下
package main
import "fmt"
func main() {
a := []int{4, 5, 6, 1, 3, 2}
b := insert(a)
for i := 0; i < len(b); i++ {
fmt.Println(b[i])
}
}
func insert(a []int) []int {
if len(a) <= 1 { 如果数组长度小于等于1 不用排序直接返回
return a
}
for i := 1; i < len(a); i++ { 遍历数组,确定要重新插入的元素,从第2个元素开始,一直到最后一个元素
value := a[i] 记录要插入元素的值
j := i - 1 而j表示的是插入位置,插入位置从i的前一个位置开始
for ; j >= 0; j-- { 遍历j寻找插入位置
if a[j] > value { 如果当前j位置的元素大于记录的元素,说明该位置不是要插入的位置,需要将j往前移动,但在移动j之前,需要将a[j]的值向后移动,以腾出插入位置
a[j+1] = a[j]
} else { 如果当前j的值小于valuel,说明j+1这个位置就是该元素的插入位置 ,找到插入位置中断循环
break
}
}
a[j+1] = value
}
return a
}
冒泡排序
代码如下
package main
import "fmt"
func main() {
a := []int{8, 2, 3, 1, 9, 6}
b := bubble(a)
for i := 0; i < len(b); i++ {
fmt.Println(b[i])
}
}
func bubble(a []int) []int {
if len(a) <= 1 {
return a
}
for i := 0; i < len(a); i++ { i表示已经排序好元素的个数
flag := false 设置一个标志位,来记录每一轮排序是否有元素交换
for j := 0; j < len(a)-i-1; j++ { j表示需要进行排序的元素,从第一个元素,到len(a)-i-1,当每排完一轮,需要排序的元素的最终下标就会往前移动
if a[j] > a[j+1] { 比较前后两个元素的大小,如果前面的元素大于后面的元素则进行交换
a[j], a[j+1] = a[j+1], a[j]
flag = true 如果发生交换,则把标志位置为true
}
}
if !flag { 如果这一轮没有发生交换,则说明已经排好序了,就可以进行break了
break
}
}
return a
}
选择排序
代码如下
package main
import "fmt"
func main() {
a := []int{8, 2, 3, 1, 9, 6}
b := xuanze(a)
for i := 0; i < len(b); i++ {
fmt.Println(b[i])
}
}
func xuanze(a []int) []int {
if len(a) <= 1 {
return a
}
for i := 0; i < len(a)-1; i++ { i表示前i个元素已经排序好了,如i=2 ,则说明有两个元素已经排序好了,那么此时未排序的下标则为i
minindex := i 取未排序的开始下标作为最小下标的初始值
for j := i + 1; j < len(a); j++ { j取未排序开始下标的后一个,避免重复
if a[minindex] > a[j] { 遍历未排序的数组部分,找到最小值,并将这个值所对应的下标定义为最小下标
minindex = j
}
}
a[i], a[minindex] = a[minindex], a[i] 交换最小下标和未排序的开始下标。注 :i作为下标表示未开始排序的数组的第一个元素,也是排序完成部分的后一个元素 ,这样交换,确保将未排序的最小值放在了排序完成元素的后一个位置
}
return a
}