'''Created on 2017-1-6@author: admin'''def buildHeap(source,parent): if left(parent)>=len(source): return elif right(parent)>=len(source): if source[parent]>source[left(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp buildHeap(source, left(parent)) else: buildHeap(source, left(parent)) buildHeap(source, right(parent)) if source[parent]>source[left(parent)] and source[parent]>source[right(parent)]: if source[left(parent)]<source[right(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp buildHeap(source, left(parent)) else: tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp buildHeap(source, right(parent)) elif source[parent]>source[left(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp buildHeap(source, left(parent)) elif source[parent]>source[right(parent)]: tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp buildHeap(source, right(parent))def left(parent): return parent*2+1def right(parent): return parent*2+2def heapFye(source,parent,last): if left(parent)>last: return elif right(parent)>last: if source[parent]>source[left(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp heapFye(source, left(parent),last) else: if source[parent]>source[left(parent)] and source[parent]>source[right(parent)]: if source[left(parent)]<source[right(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp heapFye(source, left(parent),last) else: tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp heapFye(source, right(parent),last) elif source[parent]>source[left(parent)]: tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp heapFye(source, left(parent),last) elif source[parent]>source[right(parent)]: tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp heapFye(source, right(parent),last) def heapSort(source): buildHeap(source,0) for i in reversed(range(len(source))): tmp=source[0] source[0]=source[i] source[i]=tmp heapFye(source, 0,i-1)def printData(source): for i in range(len(source)): print(source[i],end=",")if __name__ == '__main__': source=[19,6,1,18,3,11,20,17,15,22,17,14,31,112] heapSort(source) printData(source)
优化版
'''Created on 2017-1-6@author: admin'''def buildHeap(source,parent): if left(parent)>=len(source): return elif right(parent)>=len(source): if source[parent]>source[left(parent)]: swapAndRecLeft(source,parent) else: buildHeap(source, left(parent)) buildHeap(source, right(parent)) if source[parent]>source[left(parent)] and source[parent]>source[right(parent)]: if source[left(parent)]<source[right(parent)]: swapAndRecLeft(source,parent) else: swapAndRecRight(source,parent) elif source[parent]>source[left(parent)]: swapAndRecLeft(source,parent) elif source[parent]>source[right(parent)]: swapAndRecRight(source,parent)def swapAndRecLeft(source,parent): tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp buildHeap(source, left(parent)) def swapAndRecRight(source,parent): tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp buildHeap(source, right(parent))def left(parent): return parent*2+1def right(parent): return parent*2+2def swapAndHeapFyeLeft(source,parent,last): tmp=source[parent] source[parent]=source[left(parent)] source[left(parent)]=tmp heapFye(source, left(parent),last)def swapAndHeapFyeRight(source,parent,last): tmp=source[parent] source[parent]=source[right(parent)] source[right(parent)]=tmp heapFye(source, right(parent),last)def heapFye(source,parent,last): if left(parent)>last: return elif right(parent)>last: if source[parent]>source[left(parent)]: swapAndHeapFyeLeft(source,parent,last) else: if source[parent]>source[left(parent)] and source[parent]>source[right(parent)]: if source[left(parent)]<source[right(parent)]: swapAndHeapFyeLeft(source,parent,last) else: swapAndHeapFyeRight(source,parent,last) elif source[parent]>source[left(parent)]: swapAndHeapFyeLeft(source,parent,last) elif source[parent]>source[right(parent)]: swapAndHeapFyeRight(source,parent,last) def heapSort(source): buildHeap(source,0) for i in reversed(range(len(source))): tmp=source[0] source[0]=source[i] source[i]=tmp heapFye(source, 0,i-1)def printData(source): for i in range(len(source)): print(source[i],end=",")if __name__ == '__main__': source=[19,6,1,18,3,11,20,17,15,22,17,14,31,112] heapSort(source) printData(source)
0 0