Go数据结构与算法-堆排序

Go数据结构与算法-堆排序,第1张

概述本文章向大家介绍Go数据结构算法-堆排序,主要包括Go数据结构与算法-堆排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Title: Go数据结构与算法-堆排序


Tags: go,算法

介绍

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法(一般升序采用大顶堆,降序采用小顶堆):

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;


小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

基本思想

1.创建一个堆 H[0……n-1];


2.把堆首(最大值)和堆尾互换;


3.把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;


4.重复步骤 2,直到堆的尺寸为 1。

算法复杂度

平均时间复杂度为: Ο(nlogn)

排序过程

演示

func heapSort(arr []int) []int {

arrLen := len(arr)

buildMaxHeap(arr,arrLen)

for i := arrLen - 1; i >= 0; i-- {

swap(arr,i)

arrLen -= 1

heAPIfy(arr,arrLen)

}

return arr

}

func buildMaxHeap(arr []int,arrLen int) {

for i := arrLen / 2; i >= 0; i-- {

heAPIfy(arr,i,arrLen)

}

}

func heAPIfy(arr []int,arrLen int) {

left := 2*i + 1

right := 2*i + 2

largest := i

if left < arrLen && arr[left] > arr[largest] {

largest = left

}

if right < arrLen && arr[right] > arr[largest] {

largest = right

}

if largest != i {

swap(arr,largest)

heAPIfy(arr,largest,arrLen)

}

}

func swap(arr []int,j int) {

arr[i],arr[j] = arr[j],arr[i]

}

总结

以上是内存溢出为你收集整理的Go数据结构与算法-堆排序全部内容,希望文章能够帮你解决Go数据结构与算法-堆排序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存