堆排序python实现

来源:互联网 发布:linux 重启oracle监听 编辑:程序博客网 时间:2024/06/06 18:50
'''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
原创粉丝点击