zoukankan      html  css  js  c++  java
  • python之堆排序算法代码

    以下是个人写的堆排序代码,原理我就不解释了(简单来说就是先建立一个大顶堆,然后进行顶点和最后节点的互换,互换之后需要重新建堆,两两比对,具体的话可以参照其他的,不过代码还是会于注释的。

        #根据问题进行编码,由于数组下标是从0开始的,而树的节点从1开始,我们还需要引入一个辅助位置,Python提供的原始数据类型list实际上是一个线性(Array),                        
        #由于我们需要在序列最左边追加一个辅助位,线性表这样做的话开销很大,需要把数组整体向右移动,所以list类型没有提供形如appendleft的函数,但是在一个 
         #链表里做这种操作就很简单了,Python的collections库里提供了链表结构deque,我们先使用它初始化一个无序序列:
        from collections import deque #引用链表
    
        def heap_adjust(data,start,length): #建一个大顶堆,上面最大,且父节点比左右两个子节点都要大
                
                temp=data[start]  #定义一个中间变量temp,代表父节点的值
                left=start*2 #父节点下左节点的索引值
                right=left+1 #父节点下右节点的索引值
                while left<=length  #主要在两两比对的时候需要用到while
                     if left<length and data[left]<data[right]: #判断左节点是否小于右节点,取节点的最大值
                            left=left+1 #如果右节点大,则把左节点的索引定位到右节点
                     if  temp<data[left]: #判断子节点是否大于父节点
                         data[start],data[left]=data[left],data[start] #子节点与父节点的值互换
                         start=left #将父节点的索引指向子节点,主要用于两两比对,重新建堆的情况下
                         left=left*2 #将子节点的索引指向下一个子节点,主要用于两两比对,重新建堆的情况下
                     else:
                            break
           def heap_sort(data):
                
                    data_length = len(data) - 1#由于在链表中多加了一个元素,所以长度需要减一
                    first_sort_count = int(data_length / 2) #第一个排序的长度
                    for i in range(first_sort_count):#使用向上比较的方法建立大顶堆
                        heap_adjust(data, first_sort_count - i, data_length)
                    for i in range(data_length - 1):#使用向下比较的方法建立大顶堆,重新找出最大值
                         data[1],data[data_length-i]=data[data_length-i],data[1]
                         heap_adjust(data, 1, data_length - i - 1)
                         return [data[i] for i in range(1, len(data))]    
               def main():
                        L = deque([50, 16, 30, 10, 60,  90,  2, 80, 70]) #把列表转换成链表
                        L.appendleft(0) #在列表的最左边加一个为0的数
    
                        print(heap_sort(L))
    
    
                if __name__ == '__main__':
                        main()
  • 相关阅读:
    SDN第4次上机作业
    SDN第三次作业
    SDN第三次上机作业
    SDN第二次上机作业
    SND第二次作业
    【Beta Scrum】冲刺!4/5
    【Beta Scrum】冲刺! 3/5
    【Beta Scrum】冲刺! 2/5
    【Beta Scrum】冲刺! 1/5
    SDN第二次上机作业
  • 原文地址:https://www.cnblogs.com/bobo-wq/p/11675095.html
Copyright © 2011-2022 走看看