剑指offer编程题——08_2 堆排序的头文件

本文介绍了一个最大堆的数据结构实现,包括构建最大堆的方法、向下筛选法保持堆的性质、删除最大值的操作等。通过具体的类成员函数实现展示了如何在C++中使用数组来实现这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*最大堆定义*/


#include <iostream>
using namespace std;

class MaxHeap
{
private:
int size; //最大堆的元素数目
int * array;  //最大堆数组的首地址指针


public:
MaxHeap(int array[], int n); //用已有数组初始化一个最大堆
void buildHeap();   //构建最大堆
void siftDown(int index);  //向下筛选法
void swap(int index1, int index2);  //交换位置为index1与index2的元素
void removeMax();  //删除堆顶的最大值--与数组最后一个元素交换位置并重新构建最大堆
int leftChild(int index);  //返回左孩子的位置
int rightChild(int index);  //返回右孩子的位置

};


//最大堆类成员函数的实现

MaxHeap::MaxHeap(int array[], int n){
this->array = array;
size = n;
buildHeap();
}

void MaxHeap::buildHeap(){
for (int i = size / 2 - 1; i >= 0; --i){
siftDown(i);
}
}

void MaxHeap::siftDown(int index){
int max_ind = leftChild(index);
while (max_ind < size){
if (max_ind < size - 1 && array[rightChild(index)] > array[max_ind])
max_ind++;
if (array[index] > array[max_ind])
break;
swap(index, max_ind);
index = max_ind;
max_ind = leftChild(index);
}
}
/* 向下调整通用写法 */
void AdjustDown(int *A, int k, int n){
A[0] = A[k];
for (int i = k * 2; i < n; i *= 2){
if (A[i] < A[i + 1])
++i;
if (A[i] > A[0]){
A[k] = A[i];
k = i;
}
else
break;
}
A[k] = A[0];  // 被筛选结点的最终位置
}

void MaxHeap::swap(int index1, int index2){
int tmp = array[index1];
array[index1] = array[index2];
array[index2] = tmp;
}

void MaxHeap::removeMax(){
swap(0, size - 1);
size--;
siftDown(0);
}

int MaxHeap::leftChild(int index){
return index * 2 + 1;
}

int MaxHeap::rightChild(int index){
return index * 2 + 2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值