用python写堆排序
时间: 2023-04-08 11:02:36 浏览: 118
可以回答这个问题。堆排序是一种高效的排序算法,它利用堆的数据结构来实现排序。在Python中,可以使用heapq模块来实现堆排序。具体实现方法可以参考以下代码:
import heapq
def heap_sort(arr):
heap = []
for i in arr:
heapq.heappush(heap, i)
sorted_arr = []
while heap:
sorted_arr.append(heapq.heappop(heap))
return sorted_arr
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_arr = heap_sort(arr)
print(sorted_arr)
输出结果为:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
相关问题
请用Python写堆排序问题
好的,以下是Python实现堆排序的代码:
```python
def heap_sort(arr):
# 创建最大堆
def build_heap(arr, size):
for i in range(size // 2 - 1, -1, -1):
heapify(arr, i, size)
# 维护最大堆
def heapify(arr, i, size):
left_child = 2 * i + 1
right_child = 2 * i + 2
largest = i
if left_child < size and arr[left_child] > arr[largest]:
largest = left_child
if right_child < size and arr[right_child] > arr[largest]:
largest = right_child
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, largest, size)
size = len(arr)
build_heap(arr, size)
for i in range(size - 1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, 0, i)
return arr
```
使用示例:
```python
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(heap_sort(arr))
# [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
```
该代码实现了堆排序算法,时间复杂度为 O(nlogn)。
使用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()`函数中,对于给定输入数组,首先通过遍历所有非叶子节点来构建一个最大堆 ,其余所有的节点都满足最大堆的性质。 然后对于每个元素,将它移至堆的底部,逐步进行堆排列以保证根节点是堆的最大值。 在完成第一个元素后,我们可以只对余下的元素执行相同的操作,从而获得排序的数组。
阅读全文