1. 冒泡排序
func main() {
arr := []int{1, 5, 3, 7, 2, 4, 8, 6}
fmt.Println("old",arr)
for i := 0; i < len(arr); i++ {
for j := 0; j < len(arr); j++ {
if arr[i] < arr[j]{
temp := arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
fmt.Println("new",arr)
}
2.简单选择排序
func main() {
arr := []int{1, 5, 3, 7, 2, 4, 8, 6}
fmt.Println("old", arr)
SelectSort(arr,len(arr))
fmt.Println("new", arr)
}
func SelectSort(a []int, n int) {
var key, tmp int
for i := 0; i< n; i++ {
key = SelectMinKey(a, n,i)
if key != i {
tmp = a[i]; a[i] = a[key]; a[key] = tmp
}
print(a, n , i)
}
}
func SelectMinKey(a []int, n int ,i int ) int {
k := i
for j:=i+1 ;j< n; j++ {
if a[k] > a[j] {
k = j
}
}
return k
}
3. 堆排序
package main
import "fmt"
func main() {
arr := []int{1, 5, 3, 7, 2, 4, 8, 6}
sort(arr)
fmt.Println(arr)
}
func sort(arr []int) {
//1.构建大顶堆
for i := len(arr)/2 - 1; i >= 0; i-- {
//从第一个非叶子结点从下至上,从右至左调整结构
adjustHeap(arr, i, len(arr))
}
//2.调整堆结构+交换堆顶元素与末尾元素
for j := len(arr) - 1; j > 0; j-- {
swap(arr, 0, j) //将堆顶元素与末尾元素进行交换
adjustHeap(arr, 0, j) //重新对堆进行调整
}
}
func adjustHeap(arr []int, i int, length int) {
temp := arr[i] //先取出当前元素i
for k := i*2 + 1; k < length; k = k*2 + 1 { //从i结点的左子结点开始,也就是2i+1处开始
if k+1 < length && arr[k] < arr[k+1] { //如果左子结点小于右子结点,k指向右子结点
k++
}
if arr[k] > temp { //如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
arr[i] = arr[k]
i = k
} else {
break
}
}
arr[i] = temp //将temp值放到最终的位置
}
func swap(arr []int, a int, b int) {
temp := arr[a]
arr[a] = arr[b]
arr[b] = temp
}