【常见算法】个人笔记

2、堆排序

写于:2020/11/16
学习背景:大厂有一个面试题,从1亿人中,找出最富有的10个人,就需要用到堆排序,然而我不会,所以就学习它,并记录下来。
在这里插入图片描述
代码实现:

# -*- coding: utf-8 -*-
# @Time    : 2020/11/16 22:13
# @Author  : 成文武

def heapify(tree,n,i):
    #递归退出条件
    if i>=n:
        return
    c1=2*i+1  #左子树下标
    c2=2*i+2  #右子树下标
    max=i
    if c1<n and tree[c1]>tree[max]:
        max=c1
    if c2<n and tree[c2]>tree[max]:
        max=c2
    if max!=i:
        tree[i],tree[max]=tree[max],tree[i]
        #前提:父节点的子树都已经是堆
        heapify(tree,n,max)

def build_heap(tree,n):
    last_node=n-1
    #从最后一个节点的父节点开始建堆
    parent=int((last_node-1)/2)
    for i in range(parent,-1,-1):
        heapify(tree,n,i)
def heap_sort(tree):
    n=len(tree)
    build_heap(tree,n)
    for i in range(n-1,-1,-1):
        #根节点与最后一个节点交换
        tree[i],tree[0]=tree[0],tree[i]
        #每交换一次后,叶子节点减少一个
        heapify(tree,i,0)
    return tree

if __name__ == '__main__':
    phone_tree=[1,5,7,6,6,5,0,7,6,9,1]
    res=heap_sort(phone_tree)
    print(res)  #[0, 1, 1, 5, 5, 6, 6, 6, 7, 7, 9]

1、快速排序

快速排序——JAVA实现(图文并茂)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值