首页 > 其他分享 >堆排序

堆排序

时间:2022-12-21 18:34:07浏览次数:31  
标签:arr heap IntHeap int 堆排序 func topmax

堆排序

时间复杂度:O(logn)

先创建一个堆,然后调整堆,调整过程是将节点和子节点进行比较,将其中最大的值变为父节点,递归调整调整次数lgn,最后将根节点和尾节点交换再n次调整O(nlgn).

算法步骤:

  • 创建最大堆或者最小堆

  • 调整堆

  • 交换首尾节点

手写堆排序

package sort

import "fmt"

func HeapSortMax(arr []int, length int) []int {
    // length := len(arr)
    if length <= 1 {
        return arr
    }
    depth := length/2 - 1 //二叉树深度
    for i := depth; i >= 0; i-- {
        topmax := i //假定最大的位置就在i的位置
        leftchild := 2*i + 1
        rightchild := 2*i + 2
        if leftchild <= length-1 && arr[leftchild] > arr[topmax] { //防止越过界限
            topmax = leftchild
        }
        if rightchild <= length-1 && arr[rightchild] > arr[topmax] { //防止越过界限
            topmax = rightchild
        }
        if topmax != i {
            arr[i], arr[topmax] = arr[topmax], arr[i]
        }
    }
    return arr
}
func HeapSort(arr []int) []int {
    length := len(arr)
    for i := 0; i < length; i++ {
        lastlen := length - i
        HeapSortMax(arr, lastlen)
        if i < length {
            arr[0], arr[lastlen-1] = arr[lastlen-1], arr[0]
        }
    }
    return arr
}

heap

package main

import (
    "container/heap"
    "fmt"
)

// IntHeap 实现 heap.Interface 接口
type IntHeap []int

func (h IntHeap) Len() int {
    return len(h)
}

func (h IntHeap) Less(i, j int) bool {
    // 如果设置 h[i] < h[j] 就是小顶堆,h[i] > h[j] 就是大顶堆
    return h[i] < h[j]
}

func (h IntHeap) Swap(i, j int) {
    h[i], h[j] = h[j], h[i]
}

func (h *IntHeap) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *IntHeap) Pop() interface{} {
    x := (*h)[len(*h)-1]
    *h = (*h)[:len(*h)-1]
    return x
}

func main() {
    // 创建切片
    h := &IntHeap{2, 1, 5, 6, 4, 3, 7, 9, 8, 0}

    // 初始化小顶堆
    heap.Init(h)
    fmt.Println(*h) // [0 1 3 6 2 5 7 9 8 4]

    // Pop 元素
    fmt.Println(heap.Pop(h).(int)) // 0

    // Push 元素
    heap.Push(h, 6)
    fmt.Println(*h) // [1 2 3 6 4 5 7 9 8 6]

    for h.Len() != 0 {
        fmt.Printf("%d ", heap.Pop(h).(int)) // 1 2 3 4 5 6 6 7 8 9
    }
}

标签:arr,heap,IntHeap,int,堆排序,func,topmax
From: https://www.cnblogs.com/geraldkohn/p/16996903.html

相关文章

  • HeapSort堆排序原理与实现
    HeapSort堆排序原理与实现  堆排序是比较重要的数据结构,其主要优点是通过排序二叉树的特性能够记录每个数之间的大小关系,以至于不需要重复比较,对于海量数据排序问题可以减......
  • 选择排序(简单选择排序,堆排序)
    学习时间2022.12.17选择排序基本概念简单选择排序第1次,遍历整个数组,找到最小的数字,将其与第一位进行调换;第2次,遍历除以排序好的第1个数,遍历后面所有数字,找到最小的,与......
  • Go-堆排序
    packagemainimport"fmt"funcHeapSort(arr[]int)[]int{length:=len(arr)fori:=0;i<length;i++{lastmesslen:=length-i//......
  • 堆排序heapSort_legend
    堆排序:(一)定义:从小到大排序则构建一个最大堆;从大到小排序,则构建一个最小堆。(二)思想:1.先建立一个最大堆;2.然后将最大堆的堆顶元素(0号元素,最大值)与堆的最后一个元素(n-1号......
  • 堆排序
    比较常见的排序方法,见例题:本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。函数接口定义:voidHeapAdjust(HeapTypeH,ints,intm);其中L是待排序表,使排......
  • 堆排序
    输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。#include<iostream>usingnamespacestd;constintN=1e5+10;intn,m,len;inth[N];voiddown......
  • 与堆和堆排序相关的问题
    与堆和堆排序相关的问题作者:Grey原文地址:博客园:与堆和堆排序相关的问题CSDN:与堆和堆排序相关的问题堆结构说明堆结构就是用数组实现的完全二叉树结构,什么是完全二叉......
  • 堆排序算法
    堆排序算法堆排序定义:堆排序是将一组无序数组(二叉树)构建成一个堆,分为大顶堆和小顶堆大顶堆:父节点的值永远大于其左子树和右子树的值堆排序思路:将堆顶元素与末尾元......
  • 堆排序+TOPK问题
    (文章目录)一.堆排序1.使用向上还是向下调整建堆好?(1)向上调整算法建堆的时间复杂度voidadjustup(HPDatatype*a,intchild)//向上调整算法{ intparent=(child-......
  • [排序算法] 堆排序 (C++)
    堆排序解释什么是堆堆heap是一种近似完全二叉树的数据结构,其满足一下两个性质1.堆中某个结点的值总是不大于(或不小于)其父结点的值;2.堆总是一棵完全二叉树将根......