本文共 2905 字,大约阅读时间需要 9 分钟。
堆是一种非常有趣且重要的数据结构,它以其特殊的性质,使得许多高效算法成为可能。尤其在编程问题中,堆常常被用来解决排序问题,或者用来实现优先队列的功能。在本文中,我们将深入探讨堆的实现以及它在实际问题中的应用。
堆的初始化可以通过调整的过程来完成。每当一个元素插入堆之后,需要确保该元素的位置是否满足堆的性质。如果不满足,进行调整直到满足为止。
void heap_adjust(int x) { while (x * 2 <= tot) { int j = x * 2; if (j + 1 <= tot && heap[j + 1] > heap[j]) { j++; } if (heap[j] > heapp[x]) { swap(heap[x], heap[j]); x = j; } else { break; } }}void Adjust(int tot) { for (int i = tot / 2; i >= 1; i--) { heap_adjust(i); }}
在某些问题中,例如合并两个有序链表,我们可以用堆来实现。以下是一个朴素的合并示例,使用堆来合并两个有序序列:
#include#include #include using namespace std;void upload_Lb(int k) { while (k > 1) { if (h[k / 2] > h[k]) { swap(h[k / 2], h[k]); k /= 2; } else { return; } }}void down(int k) { while (2 * k <= tot) { int j = 2 * k; if (j < tot && h[j + 1] < h[j]) { j++; } if (h[j] < h[k]) { swap(h[j], h[k]); k = j; } else { return; } }}int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); h[i] = x; tot++; up(tot); } for (int i = 1; i < n; i++) { int tmp = h[1]; h[1] = h[tot--]; down(1); tmp += h[1]; h[1] = h[tot--]; down(1); ans += tmp; h[++tot] = tmp; up(tot); } printf("%d", ans); return 0;}
在C++标准库中,priority_queue 提供了优先队列的实现,可以根据需求选择升序队列或降序队列。以下是 priority_queue 的基本用法示例:
#includeusing namespace std;// 升序队列priority_queue
堆排序是一种优化排序算法,利用了堆的性质来进行排序。其步骤如下:
以下是具体实现代码:
#include#include using namespace std;void max_heapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { if (son + 1 <= end && arr[son] < arr[son + 1]) { son++; } if (arr[dad] > arr[son]) { return; } else { swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } }}void heap_sort(int arr[], int len) { for (int i = len / 2 - 1; i >= 0; i--) { max_heapify(arr, i, len - 1); } for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); }}int main() { int arr[] = {3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6}; int len = sizeof(arr) / sizeof(*arr); heap_sort(arr, len); for (int i = 0; i < len; i++) { cout << arr[i] << ' '; } cout << endl; return 0;}
转载地址:http://yfsyk.baihongyu.com/