堆排序python实现


因为部门频繁调整,半年多时间直接上级换了三个,之前一起工作的同事被调离的时候大头没有放我过去,说还有业务让我支撑,在这次调整大头也被调走了,现在小团队的业务已经不再重要,人也都是一些老弱病残,并且技术路线也与部门大团队完全不同,因此,最近想换一个公司或者部门来寻找更好的发展。当我前几天到公司另一个部门面试了以后,才意识到对于一个刚刚工作1年多的人,在将近1年的业务紧密相关的开发下,算法已经忘干净了,因此,借此机会复习一下,以便早日离开这个坑。


对于堆排序主要也就是这些概念,以最大堆为例。

首先,堆是个完全二叉树,

1、每个节点值大于它的叶子节点;

2、对于index为i的节点,它的亲节点是i/2;

3、对于index为i的节点,它的左右孩子分别为i*2+1和i*2;

4、每个堆的根节点一定是整个数组的最大值

其次,堆排序思想,

1、每次建堆以后根节点必为最大值;

2、建堆完成后,将序列的第一个元素取出,这个元素一定是序列中的最大值,将剩下序列重新建堆;

3、迭代完每个元素。

最后,对排序的最坏时间复杂度为:

1、每次建堆的时间复杂度为O(lgn);

2、因此堆排序的时间复杂度为O(nlgn)。


根据这些性质,可以写出堆排序代码:

#!/bin/env python

import sys
import time

sys.setrecursionlimit(1000000)

arry_heap = [5, 13, 2, 25, 7, 17, 20, 8, 4]

def Parent(i):
    return i / 2

def Left(i):
    return i * 2 + 1

def Right(i):
    return i * 2 + 2

def Max_HeapIFY(A, i, heap_size):
    l = Left(i)
    r = Right(i)
    if l < heap_size and A[l] > A[i]:
        largest = l
    else:
        largest = i
    if r < heap_size and A[r] > A[largest]:
        largest = r

    if largest != i:
        tmp = A[largest]
        A[largest] = A[i]
        A[i] = tmp
        Max_HeapIFY(A, largest, heap_size)
    return

def Heap_Sort(A, result,  heap_size):
    tmp_list = A
    for idx in range(heap_size):
        result[idx] = tmp_list[0]
        tmp_list = tmp_list[1:]
        Build_Max_Heap(tmp_list, len(tmp_list))

def Build_Max_Heap(A, heap_size):
    for i in range(heap_size/2)[::-1]:
        Max_HeapIFY(A, i, heap_size)

if __name__ == "__main__":
    heap_size = len(arry_heap)
    print "before heap sort: %s" %arry_heap
    Build_Max_Heap(arry_heap, heap_size)
    result = [0] * heap_size
    Heap_Sort(arry_heap, result, heap_size)
    print "After heap sort: %s" %result


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值