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)