美文网首页Pythoner
Python 堆排序

Python 堆排序

作者: minimore | 来源:发表于2016-03-30 21:01 被阅读47次
# -*- coding: utf-8 -*-
# author: zhonghua
# filename: heap_sort.py
# create: 2016/3/30
# version: 1.0

# 堆排序
import math

def swap_node(lst, i, lst_len):
    # 用来判断位置i的节点与其左右子节点相比是否最大/小,如果不是则交换为最大/小
    if lst_len > (i*2): # i节点有左右子节点
        if lst[i*2] > lst[i*2+1]:
            if lst[i*2] > lst[i]:
                lst[i], lst[i*2] = lst[i*2], lst[i]
        else:
            if lst[i*2+1] > lst[i]:
                lst[i], lst[i*2+1] = lst[i*2+1], lst[i]
    elif lst_len == (i*2): # i节点只有左子节点
        if lst[i] < lst[i*2]:
            lst[i], lst[i*2] = lst[i*2], lst[i]
    else: # i节点没有左子节点
        pass
def heap_adjust(lst, lst_len):
    # 堆调整,本例是将大数值调整到堆顶
    # 计算层数
    lev = int(math.log(lst_len, 2)) + 1
    for i in range(int(math.pow(2, lev-1)-1), 0, -1):
        swap_node(lst, i, lst_len)


def heap_sort(lst):
    # 堆排序
    lst_len = len(lst) - 1
    # 先做一次调整
    heap_adjust(lst, lst_len)

    # 循环每次讲堆顶元素和堆底元素对调,并重新调整
    for i in range(lst_len, 1, -1):
        lst[1], lst[i] = lst[i], lst[1]
        heap_adjust(lst, i-1)

if __name__ == '__main__':
    # lst第一位为-1占位,不作排序
    lst = [-1, 1, 3, 6, 88, 67, 22, 99, 56, 88, 27, 160, 38,12, 7, 72, 12, 63, 356, 26, 99, 66, 86]
    heap_sort(lst)
    print 'lst', lst

相关文章

  • python实现堆排序(HeapSort)

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

  • 堆排序python

  • Python 堆排序

  • Python 堆排序

  • Python堆排序

  • 堆排序-python

    复习之前学过的堆排序,发现掌握的不是特别牢固,又仔细阅读了几篇博文,整理出来这篇记录。 1 堆排序介绍 1.1 与...

  • python堆排序

    实现了python的堆排序利用堆的特性,实现了在10000个数的列表中,找出最小的10个数,并和传统的冒泡排序进行...

  • 每周一个 Python 模块 | heapq

    专栏地址:每周一个 Python 模块 heapq 实现了适用于 Python 列表的最小堆排序算法。 堆是一个树...

  • 堆排序Python实现

    堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排...

  • python堆排序heapq

    heapq模块实现了一个适用于Python列表的最小堆排序算法。 堆是一种树形数据结构,其中子节点与父节点之间是一...

网友评论

    本文标题:Python 堆排序

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