码迷,mamicode.com
首页 > 编程语言 > 详细

python3 堆排序

时间:2017-08-24 21:34:03      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:shuff   shu   gif   UI   for   bre   append   位置   技术   

思路:

1.建立堆

2.得到堆顶元素,为最大元素

3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

4.堆顶元素为第二大元素。

5.重复步骤3,直到堆变空。

动画

技术分享

代码:

def sift(data, low, high):
    i = low      # 父节点
    j = 2 * i + 1   # 左子节点
    tmp = data[i]   # 父节点值
    while j <= high:    # 子节点在节点中
        if j < high and data[j] > data[j + 1]:  # 有右子节点且右节点比父节点值大
            j += 1
        if tmp > data[j]:
            data[i] = data[j]   # 将父节点替换成新的子节点的值
            i = j   # 变成新的父节点
            j = 2 * i + 1   # 新的子节点
        else:
            break
    data[i] = tmp   # 将替换的父节点值赋给最终的父节点


def heap_sort(data):
    n = len(data)
    # 创建堆
    for i in range(n//2-1, -1, -1):
        sift(data, i, n-1)

    # 挨个出数
    for i in range(n-1, -1, -1):    # 从大到小
        data[0], data[i] = data[i], data[0]     # 将最后一个值与父节点交互位置
        sift(data, 0, i-1)


li = list(range(10))
random.shuffle(li)
print(li)
heap_sort(li)
print(li)

实例:

将列表内的数据以id的值从小到大排序

def random_list(n):
    ‘‘‘
    生成随机数据
    :param n: 
    :return: 
    ‘‘‘
    ret = []
    a1 = [, , , , , , , , ]
    a2 = [, , , , , , , , , ‘‘]
    a3 = [, , , , , , , , , ‘‘]
    ids = range(1001, 1001 + n)
    for i in range(n):
        name = random.choice(a1) + random.choice(a2) + random.choice(a3)
        age = random.randint(18, 60)
        dic = {id: ids[i], name: name, age: age}
        ret.append(dic)
    return ret


def sift(data, low, high):
    i = low      # 父节点
    j = 2 * i + 1   # 左子节点
    tmp = data[i]   # 父节点值
    while j <= high:    # 子节点在节点中
        if j < high and data[j][id] < data[j + 1][id]:  # 有右子节点且右节点比父节点值大
            j += 1
        if tmp[id] < data[j][id]:
            data[i] = data[j]   # 将父节点替换成新的子节点的值
            i = j   # 变成新的父节点
            j = 2 * i + 1   # 新的子节点
        else:
            break
    data[i] = tmp   # 将替换的父节点值赋给最终的父节点


def heap_sort(data):
    n = len(data)
    # 创建堆
    for i in range(n//2-1, -1, -1):
        sift(data, i, n-1)

    # 挨个出数
    for i in range(n-1, -1, -1):    # 从大到小
        data[0], data[i] = data[i], data[0]     # 将最后一个值与父节点交互位置
        sift(data, 0, i-1)

li = random_list(1000) # 生成数据
random.shuffle(li) # 将数据打乱
heap_sort(li)
print(li)

 

python3 堆排序

标签:shuff   shu   gif   UI   for   bre   append   位置   技术   

原文地址:http://www.cnblogs.com/bingabcd/p/7425039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!