因為部門頻繁調整,半年多時間直接上級換了三個,之前一起工作的同事被調離的時候大頭沒有放我過去,說還有業務讓我支撐,在這次調整大頭也被調走了,現在小團隊的業務已經不再重要,人也都是一些老弱病殘,並且技術路線也與部門大團隊完全不同,因此,最近想換乙個公司或者部門來尋找更好的發展。當我前幾天到公司另乙個部門面試了以後,才意識到對於乙個剛剛工作1年多的人,在將近1年的業務緊密相關的開發下,演算法已經忘乾淨了,因此,藉此機會複習一下,以便早日離開這個坑。
對於堆排序主要也就是這些概念,以最大堆為例。
首先,堆是個完全二叉樹,
1、每個節點值大於它的葉子節點;
2、對於index為i的節點,它的親節點是i/2;
3、對於index為i的節點,它的左右孩子分別為i*2+1和i*2;
4、每個堆的根節點一定是整個陣列的最大值
其次,堆排序思想,
1、每次建堆以後根節點必為最大值;
2、建堆完成後,將序列的第乙個元素取出,這個元素一定是序列中的最大值,將剩下序列重新建堆;
3、迭代完每個元素。
最後,對排序的最壞時間複雜度為:
1、每次建堆的時間複雜度為o(lgn);
2、因此堆排序的時間複雜度為o(nlgn)。
根據這些性質,可以寫出堆排序**:
#!/bin/env python
import sys
import time
sys.setrecursionlimit(1000000)
arry_heap = [5, 13, 2, 25, 7, 17, 20, 8, 4]
def parent(i):
return i / 2
def left(i):
return i * 2 + 1
def right(i):
return i * 2 + 2
def max_heapify(a, i, heap_size):
l = left(i)
r = right(i)
if l < heap_size and a[l] > a[i]:
largest = l
else:
largest = i
if r < heap_size and a[r] > a[largest]:
largest = r
if largest != i:
tmp = a[largest]
a[largest] = a[i]
a[i] = tmp
max_heapify(a, largest, heap_size)
return
def heap_sort(a, result, heap_size):
tmp_list = a
for idx in range(heap_size):
result[idx] = tmp_list[0]
tmp_list = tmp_list[1:]
build_max_heap(tmp_list, len(tmp_list))
def build_max_heap(a, heap_size):
for i in range(heap_size/2)[::-1]:
max_heapify(a, i, heap_size)
if __name__ == "__main__":
heap_size = len(arry_heap)
print "before heap sort: %s" %arry_heap
build_max_heap(arry_heap, heap_size)
result = [0] * heap_size
heap_sort(arry_heap, result, heap_size)
print "after heap sort: %s" %result
Python實現堆排序
usr bin env python coding utf 8 堆排序 class heap object 求給定下標i的父節點下標 defparent self,i if i 2 0 return i 2 1 else return i 2 求給定下標i的左孩子下標 defleft self,i ...
python 實現堆排序
原理 迴圈陣列,依次構建最大堆,構建完以後第乙個元素就為最大值 swap 到最後乙個位置,繼續對 陣列中 0 last 1 這個新陣列構建最大堆 依次類推 到最後構建完成 arr 55,67,89,12,4,6,2,34,33,12 arrlen int len arr 調整三個元素堆 defadj...
堆排序 python實現
利用堆實現排序的簡單思路是,利用堆頂元素總是最大或者最小的性質,每次彈出乙個元素,直到堆空,則彈出元素形成的序列是有序的。但是為了節約儲存空間,我們直接將彈出的元素放在原堆記憶體的後面,這樣形成的最後形成的有序陣列的順序是和堆中資料的順序性是相反的 若是小根堆,排序後是由大到小的 若是大根堆,排序後...