21xrx.com
2024-06-02 23:44:21 Sunday
登录
文章检索 我的文章 写文章
C++实现二叉堆
2023-07-13 21:40:42 深夜i     --     --
C++ 实现 二叉堆 数据结构 算法

二叉堆是一种具有很高效的实现简单、易于维护的堆数据结构。这种数据结构被广泛应用于算法中,例如,优先队列、堆排序和图算法等。

C++是一种高效、灵活和强大的编程语言,它提供了丰富的语言特性和底层的内存管理能力。这使得C++成为实现二叉堆的理想选择。

二叉堆可以分为两种类型:最大堆和最小堆。最大堆保证父节点的值大于或等于其子节点的值,而最小堆则保证父节点的值小于或等于其子节点的值。

C++实现二叉堆的基本步骤如下:

1. 定义堆结构体或类

在C++中,可以使用结构体或类来实现二叉堆。结构体和类的定义将包含堆的元素,以及操作堆的方法和函数。例如:


struct Heap {

 std::vector<int> values;

 

 void add(int value);

 int peek();

 int pop();

 void heapify();

};

2. 实现堆的添加元素方法

在堆中添加元素时,我们需要将元素插入到堆的末尾,然后对堆进行修复,使其保持堆的特性。例如:


void Heap::add(int value) {

 values.push_back(value);

 int index = values.size() - 1;

 while (index > 0 && values[index] > values[(index - 1) / 2]) {

  std::swap(values[index], values[(index - 1) / 2]);

  index = (index - 1) / 2;

 }

}

3. 实现查看堆顶元素方法

查看堆顶元素是很重要的,因为它告诉我们堆中的最大或最小元素。例如:


int Heap::peek() {

 if (values.empty()) {

  throw std::out_of_range("Heap is empty");

 }

 return values[0];

}

4. 实现弹出堆顶元素方法

弹出堆顶元素是移除堆中的最大或最小元素,然后对堆进行修复,使其保持堆的特性。例如:


int Heap::pop() {

 if (values.empty()) {

  throw std::out_of_range("Heap is empty");

 }

 int value = values[0];

 values[0] = values.back();

 values.pop_back();

 int index = 0;

 while (2 * index + 1 < values.size()) {

  int left = 2 * index + 1;

  int right = 2 * index + 2;

  int child = left;

  if (right < values.size() && values[right] > values[left])

   child = right;

  

  if (values[child] <= values[index])

   break;

  

  std::swap(values[child], values[index]);

  index = child;

 }

 return value;

}

5. 实现堆化方法

堆化是指将一个非堆序列转换为堆序列的过程。我们可以使用建堆的方法,即从完全二叉树的倒数第二层开始,自下而上地遍历每个节点,并将其和子节点交换,直到保持堆的特性。例如:


void Heap::heapify() {

 for (int i = values.size() / 2 - 1; i >= 0; i--) {

  int index = i;

  while (2 * index + 1 < values.size()) {

   int left = 2 * index + 1;

   int right = 2 * index + 2;

   int child = left;

   if (right < values.size() && values[right] > values[left])

    child = right;

   

   if (values[child] <= values[index])

    break;

   

   std::swap(values[child], values[index]);

   index = child;

  }

 }

}

在以上步骤完成后,就可以在C++中创建二叉堆,并使用相应的方法操作堆了。这种数据结构使我们能够高效地处理大量元素,并保持良好的效率和性能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复