python heap_Python HeapSort

__author__ = 'student'

print 'hello world hello python'

'''

heap sort

root leftchild 2n+1 rightchild 2n+2

compare them and get the maxnode

step by step think way

one step write the perfect program is hard

but it is easy to write your think step by step

build max heap

then swap the biggest number with the size

heap sort is a tuning for selection sort.

'''

la =[1,5,7,3,20,0,9,4]

print ', '.join(str(x) for x in la)

#from bottom to top

def heap(la,root,heap_size=None):

if heap_size is None:

length=la.__len__()

else:

length=heap_size

lc=root*2+1

rc=root*2+2

maxnode=root

if length>lc and la[lc]>la[root]:

maxnode=lc

if length>rc and la[rc]>la[maxnode]:

maxnode=rc

if maxnode!=root:

la[maxnode],la[root]=la[root],la[maxnode]

heap(la,maxnode,heap_size)

#build max heap

def build_max_heap(la):

root=la.__len__()/2-1

while root>=0:

heap(la,root)

root-=1

#heap sort

#print ','.join (str(x) for x in xrange(la.__len__(),0,-1))

build_max_heap(la)

def heap_sort(la):

heap_size=la.__len__()-1

for i in xrange(heap_size,0,-1):

la[i],la[0]=la[0],la[i] #swap

heap(la,0,heap_size)

heap_size-=1

print heap_size,la

print la

heap_sort(la)

感悟:

学算法千万不能背,不能去抄别人的代码。

首先要去理解整个逻辑,找一个小的数据集,自己推算出其过程,

然后根据这个过程来写代码。

否则抄别人的代码,被别人的思路牵着走,最后容易忘记,还得回头学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个堆排序的 Python 代码: ``` def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr[i] < arr[l]: largest = l if r < n and arr[largest] < arr[r]: largest = r if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): n = len(arr) for i in range(n, -1, -1): heapify(arr, n, i) for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) arr = [12, 11, 13, 5, 6, 7] heap_sort(arr) print("排序后的数组是:") for i in range(len(arr)): print("%d" %arr[i]), ``` ### 回答2: 堆排序(Heap Sort)是一种基于二叉堆(Heap)数据结构的经典排序算法。在堆排序中,首先需要将待排序的序列构建成一个大顶堆或小顶堆,然后将堆顶元素与最后一个元素交换位置,并重新调整堆,反复执行这个过程直到所有元素有序。 以下是基于Python的堆排序实现代码: ```python def heapify(arr, n, i): largest = i # 根节点 left = 2 * i + 1 # 左子节点 right = 2 * i + 2 # 右子节点 # 判断左子节点是否存在且大于根节点 if left < n and arr[i] < arr[left]: largest = left # 判断右子节点是否存在且大于根节点和左子节点 if right < n and arr[largest] < arr[right]: largest = right # 如果最大值不是根节点,则交换根节点和最大值,并继续调整堆 if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) # 构建大顶堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 依次将堆顶元素与最后一个元素交换,并调整堆 for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) # 示例使用: arr = [4, 10, 3, 5, 1] heapSort(arr) print(arr) # 输出结果: [1, 3, 4, 5, 10] ``` 以上代码中,`heapify`函数用于调整堆,`heapSort`函数用于构建和排序堆。首先构建一个大顶堆,然后依次将堆顶元素与最后一个元素交换,并重新调整堆,最终得到有序序列。 注意:在堆排序中,为了简化代码,省略了对输入参数的合法性判断。实际使用中,可以添加相应判断来确保输入的正确性和安全性。 ### 回答3: 堆排序是一种基于二叉堆的排序算法,其基本思想是将待排序的数组构建成一个大(小)顶堆,然后依次取出堆顶元素,再调整剩余元素,重复此过程直至排序完成。 下面是一个使用Python编写的堆排序代码示例: ```python # 构建大顶堆 def heapify(arr, n, i): largest = i # 初始化最大值为根节点 left = 2 * i + 1 right = 2 * i + 2 # 左子节点比根节点大 if left < n and arr[left] > arr[largest]: largest = left # 右子节点比当前最大值大 if right < n and arr[right] > arr[largest]: largest = right # 如果最大值不是根节点,则进行交换,并继续调整子节点 if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) # 堆排序 def heap_sort(arr): n = len(arr) # 构建大顶堆 for i in range(n//2 - 1, -1, -1): heapify(arr, n, i) # 从堆顶依次取出元素 for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] # 将最大值放到数组末尾 heapify(arr, i, 0) # 调整剩余元素为大顶堆 # 测试代码 arr = [6, 3, 8, 2, 9, 1] heap_sort(arr) print("排序结果:", arr) ``` 以上代码中,`heapify`函数用于调整以`arr[i]`为根节点的子树为大顶堆,`heap_sort`函数则通过构建初始大顶堆和重复调整堆的过程实现堆排序。最后,通过调用`heap_sort`函数对输入的数组进行排序,并打印排序结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值