堆排序python实现
2017-01-06 16:56
381 查看
''' 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+1 def right(parent): return parent*2+2 def 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+1 def right(parent): return parent*2+2 def 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)
相关文章推荐
- python算法--堆排序详细实现
- Python实现 [堆] [堆排序]
- 利用Python实现堆排序
- Python实现二叉树存储结构的堆排序
- Python 实现堆排序
- 排序算法集合(1)-Python实现的堆排序
- 排序算法三:堆排序基本原理以及Python实现
- Python实现堆排序的方法详解
- 堆排序(python实现)
- 排序算法C++ && Python实现---堆排序
- python算法实现系列-堆排序
- Python 快速排序 堆排序——Python实现一些算法持续更新
- 快速排序,归并排序,堆排序python实现
- Python实现堆排序的方法详解
- [151225] Python3 实现最大堆、堆排序,解决TopK问题
- heapsort堆排序(3种语言实现 c/java/python)
- 堆排序PYTHON实现
- Python实现堆排序
- python 实现堆排序
- 八大排序算法的python实现(五)堆排序