''' 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))