使用python实现堆排序
时间: 2023-05-29 15:02:29 浏览: 121
基于python的堆排序算法设计与实现
堆排序是一种排序算法,它基于二叉堆的数据结构。堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。
以下是使用Python实现堆排序的代码:
```
def heapify(arr, n, i):
largest = i
l = 2 * i + 1 # left child
r = 2 * i + 2 # right child
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 heapSort(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]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
print("%d" %arr[i]),
```
在上面的程序中, `heapify()`函数用于维护堆的性质,该函数接受一个数组、一个数组的长度和一个索引值作为输入,其中i是当前的根节点。函数使用largest变量存储具有最大值的索引。然后可以通过比较左子节点和右子节点来确定largest的值。当largest变量的值不等于i时,表示最大或最小值被修改,此时需要在子树中递归堆排列以保持堆结构的性质。 在` heapSort()`函数中,对于给定输入数组,首先通过遍历所有非叶子节点来构建一个最大堆 ,其余所有的节点都满足最大堆的性质。 然后对于每个元素,将它移至堆的底部,逐步进行堆排列以保证根节点是堆的最大值。 在完成第一个元素后,我们可以只对余下的元素执行相同的操作,从而获得排序的数组。
阅读全文