Python实现堆排序
- 版本1
'''
# 简单思想
1、建立一个大根堆或者是小根堆 父节点的data域大于孩子节点的data域
2、取出堆顶后,将堆最后一个叶节点放在堆顶,同时调节堆
3、不断重复第二步,直到所有的元素被取出
如何循环判断调整
完全二叉树可利用数组存储 依次存入
父节点和孩子节点的位置关系 i i*2 i*2+1
'''
from numpy import random
def heapSort(nums):
nums_length = len(nums) - 1
while(nums_length):
swap(nums,nums_length)
nums_length = nums_length - 1
reHeap(nums,1,nums_length)
return nums
def reHeap(nums,low,length):
nums[0] = nums[low]
j = 0
while(low <= length and (j < length)):
j = low*2
if (j < length) and (nums[j + 1] > nums[j]) :
j = j + 1
if (j < length) and (nums[j] > nums[0]):
nums[low] = nums[j]
low = j
if (j < length) and (nums[j] < nums[0]):
break
nums[low] = nums[0]
return nums
def swap(nums,length):
nums[1] , nums[length] = nums[length],nums[1]
return nums
def create(n):
arr = [0]
new_index = 1
arr_ = random.randint(100, size=(n))
print(arr_)
'''
如果数组为空,直接a[1] = elem
如果数组不空,a[i*2] a[i*2 +1]
若都空 先左
若右不空 存右
平衡二叉树
'''
for elem in arr_:
length = len(arr) - 1
if len(arr)-1 == 0:
arr.insert(1,elem)
length = 1
continue
if length != new_index*2:
arr.insert(1,elem)
length = new_index*2
reHeap(arr,1,length = length)
continue
if length != new_index*2 + 1:
arr.insert(1 ,elem)
length = new_index*2 + 1
reHeap(arr,1,length = length)
new_index = new_index + 1
continue
print(arr)
return arr
print(heapSort(create(5)))