插入排序
package main
import "fmt"
func main() {
arr := []int{4, 6, 1, 9, 2}
newarr := insertSort(arr)
fmt.Println(arr)
fmt.Println(newarr)
}
// 插入排序,从第二个元素开始和前一个比较,小于就将前一个数往后移,然后就插入第一个元素,后然依次类推
func insertSort(arr []int) []int {
for i := 1; i < len(arr); i++ {
j := i
current := arr[j]
for j > 0 {
if arr[j-1] > current {
arr[j] = arr[j-1]
j--
} else {
break
}
}
arr[j] = current
}
return arr
}
冒泡排序
package main
import "fmt"
func main() {
arr := []int{4, 6, 1, 9, 2}
newarr := bubbleSort(arr)
fmt.Println(arr)
fmt.Println(newarr)
}
// 从第一个元素开始和后面逐个比较,大的往后移,小的移前移,第一轮移动最后一个,第二轮移动倒数第二个,直接第一个元素不能再比较移动
func bubbleSort(arr []int) []int {
i := len(arr)
for i > 0 {
for j := 0; j < i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
i--
}
return arr
}
选择排序
package main
import "fmt"
func main() {
arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
newarr := selectionSort(arr)
fmt.Println(arr)
fmt.Println(newarr)
}
// 选择排序,由左边起第一个起,找出最小的和第一个交换位置,再从第二个起,找出最小的和第二个交换位置,重复可得结果.
func selectionSort(arr []int) []int {
for i := 0; i < len(arr)-1; i++ {
minIdx := i
for j := i; j < len(arr)-1; j++ {
if arr[minIdx] > arr[j+1] {
minIdx = j + 1
}
}
arr[i], arr[minIdx] = arr[minIdx], arr[i]
}
return arr
}
希尔排序
package main
import "fmt"
func main() {
arr := []int{4, 6, 1, 9, 2, 5, 3, 8, 7}
newarr := shellSort(arr)
fmt.Println(arr)
fmt.Println(newarr)
}
// 希尔排序,先除以2得最大间隔两数组成组进和地插入排序,再将间隔/2组成组插入排序,直到没有间隔
func shellSort(arr []int) []int {
l := len(arr)
// 间隔多少组成一组,除以2表示最大间隔
d := l / 2
for d > 0 {
for i := 0; i < d; i++ {
// 插入排序
for z := i + d; z < l; z = z + d {
j := z
current := arr[j]
for j > i && arr[j-d] > current {
arr[j] = arr[j-d]
j = j - d
}
arr[j] = current
}
}
// 将间隔减倍
d = d / 2
}
return arr
}