排序算法-golang版

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
}










发布了48 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/aixinaxc/article/details/79070709