defheap_sort(lst):foriinrange(len(lst)-1,0,-1):_heapify(lst,0,i)lst[0],lst[i]=lst[i],lst[0]returnlstdef_heapify(lst,left,right):parent=(left+right)//2whileparent!=-1:left_child=2*parent+1right_child=2*parent+2ifright<left_child:# no childpasselifright<right_child:# only left childiflst[parent]<lst[left_child]:lst[parent],lst[left_child]=lst[left_child],lst[parent]else:# both childlargest=right_childiflst[left_child]<lst[right_child]elseleft_childiflst[parent]<lst[largest]:lst[parent],lst[largest],lst[largest],lst[parent]parent-=1
defquick_sort(lst):# base caseiflen(lst)==0:return[]pivot=lst[0]# better strategy existsleft=[]# less than pivotright=[]# more than pivotcounter=0# number of elements that equal to pivotforeleinlst:ifele<pivot:left.append(ele)elifele==pivot:counter+=1else:# pivot < eleright.append(ele)left=quick_sort(left)right=quick_sort(right)returnleft+[pivot]*counter+right