帮我写一个用python实现的堆排序代码
时间: 2023-08-28 17:15:38 浏览: 85
### 回答1:
def heap_sort(arr):
n = len(arr)
# 建立最大堆
for i in range(n//2 - 1, -1, -1):
heapify(arr, n, i)
# 将 arr[0] 与 arr[i] 交换,再堆化
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
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) 函数 heap_sort() 使用上面定义的 heapify() 函数实现堆排序算法。
### 回答2:
堆排序是一种基于比较的排序算法,它利用堆这种数据结构进行排序。堆被定义为一个完全二叉树,其中每个父节点的值都大于或等于其子节点的值(最大堆),或者每个父节点的值都小于或等于其子节点的值(最小堆)。
以下是使用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 = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("排序结果:")
for i in range(len(arr)):
print("%d" % arr[i], end=" ")
```
以上代码中,`heapify`函数用于调整某个节点及其子节点使之满足堆的性质,`heapSort`函数用于对给定数组进行堆排序。首先,使用`heapify`函数构建一个最大堆。然后,将堆顶元素与数组末尾元素交换,并调整剩余堆。重复这个过程直到整个数组有序。最后,输出排序结果。
运行上述代码,将输出以下结果:
```
排序结果:
5 6 7 11 12 13
```
此即为使用Python实现的堆排序代码。
### 回答3:
堆排序是一种非常高效的排序算法,它利用堆的性质进行排序。下面是一个用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 = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" % arr[i]),
```
以上代码中,`heapify`函数用于堆化,`heapSort`函数用于进行堆排序。通过调用`heapSort`函数传入待排序的数组,即可以实现堆排序。
阅读全文