因为部门频繁调整,半年多时间直接上级换了三个,之前一起工作的同事被调离的时候大头没有放我过去,说还有业务让我支撑,在这次调整大头也被调走了,现在小团队的业务已经不再重要,人也都是一些老弱病残,并且技术路线也与部门大团队完全不同,因此,最近想换一个公司或者部门来寻找更好的发展。当我前几天到公司另一个部门面试了以后,才意识到对于一个刚刚工作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