Python天天美味(32) - python数据结构与算法之堆排序

本文对比了选择排序和堆排序两种算法的实现方式与效率。选择排序通过反复选择最小元素并将其放置在正确位置来完成排序;堆排序则通过构建并调整堆结构实现高效排序。

1. 选择排序

选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,……

def selection_sort ( data ):
    for i in range ( len ( data ) - 1 ):
        min = data [ i ]
        k = i
        for j in range ( i , len ( data )):
            if data [ j ] < min :
                min = data [ j ]
                k = j
        if i <> k :
            data [ i ], data [ k ] = data [ k ], data [ i ]


2. 堆排序

堆排序的原理将数组调整成堆,然后将堆顶元素与最后一个元素交换,然后将最后一个节点剔除出堆,再将剩下的数组调整成堆,然后再交换堆顶元素与最后一个元素……

def heap_adjust ( data , s , m ):
    if 2 * s > m :
        return
    temp = s - 1
    if data [ 2 * s - 1 ] > data [ temp ]:
        temp = 2 * s - 1
    if 2 * s <= m - 1 and data [ 2 * s ] > data [ temp ]:
        temp = 2 * s
    if temp <> s - 1 :
        data [ s - 1 ], data [ temp ] = data [ temp ], data [ s - 1 ]
        heap_adjust ( data , temp + 1 , m )
def heap_sort ( data ):
    m = len ( data ) / 2
    for i in range ( m , 0 , - 1 ):
        heap_adjust ( data , i , len ( data ))
    data [ 0 ], data [ - 1 ] = data [ - 1 ], data [ 0 ]
    for n in range ( len ( data ) - 1 , 1 , - 1 ):
        heap_adjust ( data , 1 , n )
        data [ 0 ], data [ n - 1 ] = data [ n - 1 ], data [ 0 ]


3. 效率

堆排序的效率还是蛮高的,结果如下:

selection_sort 0:00:02.219000
heap_sort 0:00:00.157000

 

Python 天天美味系列(总)

Python 天天美味(30) - python数据结构与算法之快速排序 

Python 天天美味(31) - python数据结构与算法之插入排序 

Python 天天美味(32) - python数据结构与算法之堆排序 

Python 天天美味(33) - 五分钟理解元类(Metaclasses)[转]

Python 天天美味(34) - Decorators详解  

转载于:https://www.cnblogs.com/coderzh/archive/2008/09/22/1296195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值