码迷,mamicode.com
首页 > 编程语言 > 详细

go_排序算法_堆排序

时间:2021-03-05 13:28:37      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:调整   核心   info   inf   last   图片   lib   pac   序列   

1.5 堆排序

? 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

核心思路:

1、depth := length/2 - 1 //节点深度,n,2n+1,2n+2

2、递归思想,找出最大值放在根节点首位,之后首尾交换位置

1.5.2 算法描述
  • 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
1.5.3 动图演示

技术图片

1.5.4 代码实现
package main

import "fmt"

func HeapSort(arr []int) []int {
	length := len(arr)
	for i := 0; i < length; i++ {
		lastmesslen := length - i
		HeapScortMax(arr, lastmesslen)
		//fmt.Println(arr)
		if i < length {
			arr[0], arr[lastmesslen-1] = arr[lastmesslen-1], arr[0]
		}
		//fmt.Println("ex", arr)
	}
	return arr
}

func HeapScortMax(arr []int, length int) []int {
	//length := len(arr)
	if length <= 1 {
		return arr
	} else {
		depth := length/2 - 1 //节点深度,n,2*n+1,2*n+2
		for i := depth; i >= 0; i-- {
			topmax := i
			//left right 代表非叶子节点
			left := 2*i + 1
			right := 2*i + 2
			if left <= length-1 && arr[left] > arr[topmax] { //防止越界
				topmax = left
			}
			if right <= length-1 && arr[right] > arr[topmax] {
				topmax = right
			}

			if topmax != i {
				arr[i], arr[topmax] = arr[topmax], arr[i]
			}
		}
		return arr
	}
}

func main() {
	arr := []int{15, 21, 0, 23, 8, -1}
	fmt.Print(HeapSort(arr))
}

参考网站:
https://www.bilibili.com/video/BV114411D768
https://www.bilibili.com/video/BV1hJ411j7gD?p=24

go_排序算法_堆排序

标签:调整   核心   info   inf   last   图片   lib   pac   序列   

原文地址:https://www.cnblogs.com/ydg-941020/p/14484653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!