2018-07-08 23:28:29 +08:00
|
|
|
''' mbinary
|
|
|
|
#########################################################################
|
|
|
|
# File : heapSort.py
|
|
|
|
# Author: mbinary
|
|
|
|
# Mail: zhuheqin1@gmail.com
|
2019-01-31 12:09:46 +08:00
|
|
|
# Blog: https://mbinary.xyz
|
2018-07-08 23:28:29 +08:00
|
|
|
# Github: https://github.com/mbinary
|
|
|
|
# Created Time: 2018-07-05 16:24
|
|
|
|
# Description:
|
|
|
|
#########################################################################
|
|
|
|
'''
|
|
|
|
|
2018-07-08 16:41:55 +08:00
|
|
|
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))
|