[Python] Heap sort

1. Large root pile-> descending order

import math
import numpy as np

##################  1、大根堆排序  ######################
def heapify(nums, i):
    l = len(nums) 
    if l <= 1:
        return nums
    c1 = 2 * i + 1
    c2 = 2 * i + 2
    if (c1 <= l-1) and nums[c1] > nums[i]:
        nums[c1], nums[i] = nums[i], nums[c1]
    if (c2 <= l-1) and nums[c2] > nums[i]:
        nums[c2], nums[i] = nums[i], nums[c2]
    return nums

def build_big_heap(nums):
    l = len(nums)
    if l <= 1:
        return nums
    j = math.floor((l-1-1)/2)
    for i in range(j, -1, -1):
        nums = heapify(nums, i)
    return nums

def heap_sort(nums):
    res = []
    if len(nums) <= 1:
        return nums
    for i in range(len(nums)-1, -1, -1):
        nums = build_big_heap(nums)
        res.append(nums[0])
        nums[0], nums[i] = nums[i], nums[0]
        nums = nums[0:len(nums)-1]      
    return res
###################################################

2. Small root pile-> ascending order

#################  2、小根堆排序  ####################
def heapify(nums, i):
    l = len(nums)
    if l <= 1:
        return nums
    c1 = 2 * i + 1
    c2 = 2 * i + 2
    if c1 <= l-1 and nums[c1] < nums[i]:
        nums[c1], nums[i] = nums[i], nums[c1]
    if c2 <= l-1 and nums[c2] < nums[i]:
        nums[c2], nums[i] = nums[i], nums[c2]
    return nums

def build_small_heap(nums):
    if len(nums) <= 1:
        return nums
    j = math.floor((len(nums)-1-1)/2)
    for i in range(j, -1, -1):
        nums = heapify(nums, i)
    return nums

def heap_sort(nums):
    if len(nums) <= 1:
        return nums
    res = []
    for i in range(len(nums)-1, -1, -1):
        nums = build_small_heap(nums)
        res.append(nums[0])
        nums[0], nums[i] = nums[i], nums[0]
        nums = nums[0:i]
    return res
######################################################

3. Construct a simple logarithm to check whether the above code is correct

#构造一个对数器 检查大根堆排序
flag = True
for i in range(101):
    arr = list(np.random.randint(100, size=50))
    res2 = heap_sort(arr)

    arr.sort()
    res1 = []
    for n in arr[::-1]:
        res1.append(n)

    if res1 != res2:
        flag = False
        break
print(flag)

#构造一个对数器 检查小根堆排序
flag = True
for i in range(101):
    arr = list(np.random.randint(100, size=50))
    res2 = heap_sort(arr)

    arr.sort()

    if arr != res2:
        flag = False
        break
print(flag)

 

Published 26 original articles · won 13 · views 7292

Guess you like

Origin blog.csdn.net/original_recipe/article/details/89357547