堆排序及优化

关于堆的内容请看我这篇文章的实现
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
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,601评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,092评论 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,031评论 0 2
  • 数据类型是一组值和对值的一组操作的集合,到目前为止,我们已经详细讨论Java的原始数据类型:例如,原始数据类型in...
    jack_520阅读 1,508评论 0 0
  • 我就觉得活着好难啊,我还有140块钱过半个月,我真的很难过,很想哭,因为我家没钱,我知道爸妈也很难,可是我还是会羡...
    無終阅读 2,682评论 0 0

友情链接更多精彩内容