完全二叉树实现堆排序
时间: 2023-10-23 17:06:59 浏览: 42
完全二叉树可以通过数组来表示,堆排序是一种利用堆的性质进行排序的算法。在堆排序中,我们使用最大堆(Max Heap)来进行排序。
下面是使用完全二叉树实现堆排序的步骤:
1. 将待排序的数组构建成一个最大堆。可以通过从最后一个非叶子节点开始,对每个节点进行下沉操作来实现。下沉操作是将节点与其较大的子节点交换,直到满足最大堆的性质。
2. 构建完最大堆后,将堆顶元素(即根节点)与最后一个叶子节点交换位置。交换后,最大值就被放在了数组的最后一个位置。
3. 排除已经排好序的节点(即最后一个叶子节点),再次对剩余的节点进行下沉操作,重新调整成最大堆。
4. 重复步骤2和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
# 如果父节点不是最大值,则
相关问题
实现堆排序
堆排序是一种基于完全二叉树的排序算法,它的时间复杂度为 O(nlogn)。下面给出一份 C++ 的实现代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 调整堆
void adjustHeap(vector<int>& nums, int parent, int len) {
int temp = nums[parent];
int child = 2 * parent + 1;
while (child < len) {
if (child + 1 < len && nums[child] < nums[child + 1]) {
child++;
}
if (temp >= nums[child]) {
break;
}
nums[parent] = nums[child];
parent = child;
child = 2 * parent + 1;
}
nums[parent] = temp;
}
// 堆排序
void heapSort(vector<int>& nums) {
int len = nums.size();
// 构建大顶堆
for (int i = len / 2 - 1; i >= 0; i--) {
adjustHeap(nums, i, len);
}
// 依次将最大值放到数组末尾
for (int i = len - 1; i >= 1; i--) {
swap(nums[0], nums[i]);
adjustHeap(nums, 0, i);
}
}
int main() {
vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
heapSort(nums);
for (int num : nums) {
cout << num << " ";
}
return 0;
}
```
首先,我们需要定义一个调整堆的函数 `adjustHeap`,它接收一个数组 `nums`,一个父节点 `parent` 和数组长度 `len`。在调整堆的过程中,我们将父节点与其左右子节点进行比较,将最大值放到父节点的位置,并继续向下比较,直到找到合适的位置。
接着,我们需要定义堆排序的函数 `heapSort`,它接收一个数组 `nums`。在堆排序中,我们首先需要构建一个大顶堆,即将数组转换为一棵完全二叉树,使得每个父节点的值都大于其左右子节点的值。然后,我们每次将最大值放到数组的末尾,并重新调整堆,直到所有的元素都被排序。
最后,我们在主函数中定义一个数组 `nums`,并调用 `heapSort` 函数对其进行排序。输出结果为:1 1 2 3 3 4 5 5 5 6 9。
堆和完全二叉树的区别
堆和完全二叉树是两个不同的概念。
首先,一个完全二叉树是一种特殊的二叉树,它的每个层级都被填满,除了最后一层,最后一层的节点从左到右依次填充。换句话说,完全二叉树是一棵高度平衡的二叉树。
而堆是一种基于完全二叉树的数据结构。堆被分为最大堆和最小堆两种类型。在最大堆中,父节点的值大于或等于其子节点的值,而在最小堆中,父节点的值小于或等于其子节点的值。这种特性使得堆可以高效地找到最大或最小值,因此常常用于优先级队列和排序算法中。
要注意的是,虽然堆是基于完全二叉树实现的,但是完全二叉树不一定是堆。完全二叉树只是一种结构上的约束,而堆还要求满足特定的性质。