什么是 Python 中的堆排序?
pythonserver side programmingprogramming
堆排序是基于二叉堆数据结构的排序技术。为了进行堆排序,您需要熟悉二叉树和二叉堆。
什么是完全二叉树?
完全二叉树是一种树数据结构,其中除最后一层之外的所有级别都已完全填充。最后一层必须从左侧填充。
什么是二叉堆?
二叉堆是二叉树的一种特殊情况。二叉堆有两种类型 −
最大堆 − 每一层的父节点都大于其子节点。
最小堆 −每一层的父节点都小于其子节点。
完全二叉树的数组表示
二叉堆可以表示为数组,因为它节省空间。如果父节点存储在索引 I 处,则左子节点可以通过 2 * i + 1 计算,右子节点可以通过 2 *i + 2 计算。假设索引从 0 开始。
堆排序算法
从完全二叉树构建最大堆。
移除根节点并将其替换为堆中的最后一个元素,将堆的大小减少 1,然后再次从剩余节点构建最大堆。
重复步骤 2,直到只剩下 1 个节点。
从完全二叉树构建最大堆
这是从完全二叉树构建最大堆的代码,其中将两个子节点与根节点进行比较。如果较大的元素不是根,则将较大的元素与根交换。这是一个递归过程。当前根小于其子节点,它会不断与其下级子树进行比较,直到它到达正确位置。
以下代码从完全二叉树构建最大堆,这基本上就是我们要排序的数组。
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)
堆排序
此时,我们有了最大堆。现在我们需要做以下事情。
将根与堆中的最后一个元素交换。
将堆的大小减少 1。(这意味着最大元素已到达最后一个位置,我们不需要考虑该元素)。
重建最大堆,不包括最后一个元素。
重复上述步骤,直到只剩下 1 个元素。
for i in range(n-1, 0, -1): # 交换 arr[i], arr[0] = arr[0], arr[i] # 堆化根元素 heapify(arr, i, 0)
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 heapSort(arr): n = len(arr) # 构建最大堆 for i in range(n//2, -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 = [1, 12, 9, 5, 6, 10] heapSort(arr) n = len(arr) print("Sorted array is") for i in range(n): print(arr[i], end=' ')
TIME COMPLEXITY - O(n logn)