加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:51:43 所属栏目:百科 来源:网络整理
导读:title: Go数据结构与算法-堆排序 tags: go,算法 介绍 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利

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]

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读