您的位置:首页 > 编程语言 > Python开发

堆排序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)



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: