algorithm-in-python/sort/heapSort.py

99 lines
2.3 KiB
Python

''' mbinary
#########################################################################
# File : heapSort.py
# Author: mbinary
# Mail: zhuheqin1@gmail.com
# Blog: https://mbinary.xyz
# Github: https://github.com/mbinary
# Created Time: 2018-07-05 16:24
# Description:
#########################################################################
'''
from functools import partial
class heap:
def __init__(self, lst, reverse=False):
self.data = heapify(lst, reverse)
self.cmp = partial(lambda i, j, r: cmp(
self.data[i], self.data[j], r), r=reverse)
def getTop(self):
return self.data[0]
def __getitem__(self, idx):
return self.data[idx]
def __bool__(self):
return self.data != []
def popTop(self):
ret = self.data[0]
n = len(self.data)
cur = 1
while cur * 2 <= n:
chd = cur-1
r_idx = cur*2
l_idx = r_idx-1
if r_idx == n:
self.data[chd] = self.data[l_idx]
break
j = l_idx if self.cmp(l_idx, r_idx) < 0 else r_idx
self.data[chd] = self.data[j]
cur = j+1
self.data[cur-1] = self.data[-1]
self.data.pop()
return ret
def addNode(self, val):
self.data.append(val)
self.data = one_heapify(len(self.data)-1)
def cmp(n1, n2, reverse=False):
fac = -1 if reverse else 1
if n1 < n2:
return -fac
elif n1 > n2:
return fac
return 0
def heapify(lst, reverse=False):
for i in range(len(lst)):
lst = one_heapify(lst, i, reverse)
return lst
def one_heapify(lst, cur, reverse=False):
cur += 1
while cur > 1:
chd = cur-1
prt = cur//2-1
if cmp(lst[prt], lst[chd], reverse) < 0:
break
lst[prt], lst[chd] = lst[chd], lst[prt]
cur = prt+1
return lst
def heapSort(lst, reverse=False):
lst = lst.copy()
hp = heap(lst, reverse)
ret = []
while hp:
ret.append(hp.popTop())
return ret
if __name__ == '__main__':
from random import randint
n = randint(10, 20)
lst = [randint(0, 100) for i in range(n)]
print('random : ', lst)
print('small-heap: ', heapify(lst))
print('big-heap : ', heapify(lst, True))
print('ascend : ', heapSort(lst))
print('descend : ', heapSort(lst, True))