码迷,mamicode.com
首页 > 编程语言 > 详细

使用PYTHON完成排序(堆排序)

时间:2019-04-13 13:36:00      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:[]   return   移动   排序   ret   index   while   int   最大堆   

class HeapStructure:
    def __init__(self, ls):
        self.ls = ls

    def shift_up(self, index):  # 上移使符合堆要求
        if index == 0:
            return
        ls = self.ls
        par_index = (index - 1) // 2
        if ls[par_index] < ls[index]:
            ls[par_index], ls[index] = ls[index], ls[par_index]
        self.shift_up(index-1)

    def shift_down(self, index, last_index):  # 下移使符合堆要求
        ls = self.ls
        child_left, child_right = 2 * index + 1, 2 * index + 2
        if child_left > last_index:
            return
        if child_left < last_index and ls[child_left] < ls[child_right]:
            if ls[index] < ls[child_right]:  # 与右子节点交换
                ls[index], ls[child_right] = ls[child_right], ls[index]
                self.shift_down(child_right, last_index)
        else:
            if ls[index] < ls[child_left]:  # 与左子节点交换
                ls[index], ls[child_left] = ls[child_left], ls[index]
                self.shift_down(child_left, last_index)

    def sort(self):
        i = len(self.ls)
        if i == 0:
            return self.ls
        last_index = i - 1
        self.shift_up(last_index) # 变为最大堆
        self.ls[0], self.ls[last_index] = self.ls[last_index], self.ls[0] # 最大值移动到队尾
        last_index -= 1
        while last_index:
            self.shift_down(0, last_index=last_index) # 调整为最大堆
            self.ls[0], self.ls[last_index] = self.ls[last_index], self.ls[0]
            last_index -= 1
        return self.ls


if __name__ == '__main__':
    ls = [5, 1, 2, 4, 8, 0, 9]
    print(HeapStructure(ls).sort())
    ls = []
    print(HeapStructure(ls).sort())

使用PYTHON完成排序(堆排序)

标签:[]   return   移动   排序   ret   index   while   int   最大堆   

原文地址:https://www.cnblogs.com/lyg-blog/p/10700762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!