21xrx.com
2024-09-20 00:16:56 Friday
登录
文章检索 我的文章 写文章
C++实现堆 - 简单易懂,快速上手
2023-07-05 02:51:29 深夜i     --     --
C++ 简单易懂 快速上手 实现

堆是一种常见的数据结构,常被用来处理优先级相关的问题。C++作为一种高级编程语言,与很多其它语言相比,实现堆的过程要相对简单很多。今天我们就来聊一聊如何使用C++来实现堆。

首先,我们需要知道什么是堆。堆是一种特殊的树形数据结构,其中每个结点的值都比其子节点的值大(或小)。堆有两种类型:大根堆和小根堆。如果每个结点的值都比其子节点的值大,则为大根堆;如果每个结点的值都比其子节点的值小,则为小根堆。

接下来,我们就来看看如何使用C++来实现堆。

首先,我们需要定义一个堆结构体。在结构体中,我们定义了一个整型数组和一个表示堆大小的变量。


struct Heap {

  int arr[100];

  int size;

};

接下来,我们来定义一些堆基本操作,例如查找父节点、查找左子节点以及查找右子节点。


int parent(int i) {

  return (i - 1) / 2;

}

int leftChild(int i) {

  return (2 * i) + 1;

}

int rightChild(int i) {

  return (2 * i) + 2;

}

接下来,我们就来看看如何实现添加元素到堆中。为了保证堆的结构始终正确,我们需要进行一些操作。我们需要先将新加入的元素加入到数组的最后一个位置。然后,我们需要一个循环来向上移动这个元素,直到其找到了自己的合适位置。在这个过程中,我们可以通过与其父节点比较大小来确定它应该在堆的哪个位置。


void addToHeap(Heap* heap, int val) {

  heap->arr[heap->size++] = val;

  int i = heap->size - 1;

  while (i != 0 && heap->arr[parent(i)] < heap->arr[i]) {

    swap(heap->arr[parent(i)], heap->arr[i]);

    i = parent(i);

  }

}

下一个需要实现的操作是从堆中移除元素。删除堆顶元素时,我们需要先找到堆顶元素,然后将堆顶元素与数组最后一个元素交换位置,最后从堆中移除数组中的最后一个元素。接着,我们需要比较新的堆顶元素和其子节点的大小,确保堆的结构始终正确。


void removeFromHeap(Heap* heap) {

  heap->arr[0] = heap->arr[heap->size - 1];

  heap->size--;

  heapify(heap, 0);

}

void heapify(Heap* heap, int i) {

  int L = leftChild(i);

  int R = rightChild(i);

  int max = i;

  if (L < heap->size && heap->arr[L] > heap->arr[max]) {

    max = L;

  }

  if (R < heap->size && heap->arr[R] > heap->arr[max]) {

    max = R;

  }

  if (max != i) {

    swap(heap->arr[i], heap->arr[max]);

    heapify(heap, max);

  }

}

最后,我们来看看如何打印出堆的元素。我们只需要循环遍历数组,按顺序打印出数组中的每一个元素即可。


void printHeap(Heap* heap) {

  for (int i = 0; i < heap->size; i++) {

    cout << heap->arr[i] << " ";

  }

  cout << endl;

}

至此,我们已经完成了如何使用C++来实现堆的所有内容。此时你再来看看整个过程,它其实是非常简单的,并且可以让你快速将堆的思想应用到编程中。随着你的编程技巧增强,你还可以跟据需要对这些操作进行扩展和改进。

  
  

评论区

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