美文网首页
堆排序及优化

堆排序及优化

作者: 我有一只碗 | 来源:发表于2018-02-10 16:09 被阅读0次

关于堆的内容请看我这篇文章的实现
https://www.jianshu.com/p/1e3a94f6c681

下面我们说说堆排序
既然我们已经有了堆,那么堆排序就显得十分容易了

func HeapSortOne(arr []int) {
    maxHeap := MaxHeap{}
    maxHeap.Init(len(arr))
    for _, e := range arr {
        maxHeap.Insert(e)
    }
    for i := range arr {
        arr[i] = maxHeap.Extract()
    }
}

上面的代码就是先生成一个堆,然后将需要排序的元素放入堆中,再从堆中取出,这样就完成了排序。这种方法虽然简单,但是存在着缺陷,就是函数内部需要一个和需要排序的序列大小一样的序列,十分消耗内存,下面我们改进一下。

func HeapSortTwo(arr []int) {
    // heapify操作,使其变成一个堆
    for i := (len(arr) - 2) / 2; i >= 0; i-- {
        shiftDown(arr, len(arr)-1, i)
    }

    // 将第一个和最后一个元素交换
    // 这样就可以认为最后一个元素找到了位置
    // 再改变第一个元素的位置,维护这个除了最后一个元素的堆
    for i := len(arr) - 1; i > 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        shiftDown(arr, i-1, 0)
    }
}

func shiftDown(arr []int, n int, i int) {
    temp := arr[i]
    for i*2+1 <= n {
        k := i*2 + 1
        if k+1 <= n && arr[k+1] > arr[k] {
            k++
        }
        if temp >= arr[k] {
            break
        }
        arr[i] = arr[k]
        i = k
    }
    arr[i] = temp
}

相关文章

  • 堆排序及优化

    关于堆的内容请看我这篇文章的实现https://www.jianshu.com/p/1e3a94f6c681 下面...

  • 常见的排序算法-2.1 选择排序(堆排序)

    选择排序的优化方案(堆排序)

  • 03-堆排序(Heap Sort)

    堆排序(Heap Sort) 结合上一讲的内容,发现选择排序可以使用堆排序来进行优化。所以堆排序可以认为是对选择排...

  • python实现堆排序(HeapSort)

    python实现【堆排序】(HeapSort) 算法原理及介绍 堆排序(Heapsort)是指利用堆这种数据结构所...

  • 《大话数据结构》笔记二(排序)

    1 冒泡排序(优化)2 选择排序3 直接插入排序4 希尔排序5 堆排序6 归并排序(优化)7 快速排序(优化) 1...

  • 堆排序(dart实现)

    堆排序 [toc] 堆排序是选择排序的一种优化 1.执行流程 对序列进行原地建堆 重复执行下面的操作,直到对的元素...

  • 算法与数据结构(七):快速排序

    在上一篇中,回顾了一下针对选择排序的优化算法——堆排序。堆排序的时间复杂度为O(nlogn),而快速排序的时间复杂...

  • [数据结构与算法-iOS 实现]堆排序附demo

    堆排序 堆排序实际上是对选择排序的一个优化,选择排序每次都要选出一个最大值,相当于从头遍历到尾去选择最大值,时间复...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 堆排序

    目录 1.堆排序介绍 2.堆排序图文说明 3.堆排序的时间复杂度和稳定性 4.堆排序实现 堆排序介绍 堆排序(He...

网友评论

      本文标题:堆排序及优化

      本文链接:https://www.haomeiwen.com/subject/xazctftx.html