最大堆相关操作

原理可参见:点击打开链接

运行代码:

#include<iostream>
using namespace std;
class heapSort{
private:
	int* array;
	int maxSize;
	int currentSize;
public:
	heapSort();
	~heapSort();
	void buildHeap(int size);
	bool isLeftChild(int pos);
	bool isRightChild(int pos);
	int getLeftChild(int pos);
	int getRightChild(int pos);
	int getParent(int pos);
	int deleteValue(int pos);
	void insertValue(int pos, int data);
	int deleteMax();
	void makeHeap(int *array, int i, int currentSize);
	void getResult();
};

heapSort::heapSort(){
	array = NULL;
	maxSize = 0;
	currentSize = 0;
}

heapSort::~heapSort(){
	if (array != NULL) {
		delete[]array;
	}
	array = NULL;
	maxSize = 0;
	currentSize = 0;
}

bool heapSort::isLeftChild(int pos){   //判断左孩子是否存在
	if (pos < 0 || pos >= currentSize) {
		cout << "输入数据长度有误" << endl;
		return false;
	}
	if (pos * 2 + 1< currentSize) {
		return true;
	}
	else {
		return false;
	}
}

bool heapSort::isRightChild(int pos){   //判断右孩子是否存在
	if (pos < 0 || pos >= currentSize) {
		cout << "输入数据长度有误" << endl;
		return false;
	}
	if ((pos * 2 + 2)< currentSize) {
		return true;
	}
	else {
		return false;
	}
}

int heapSort::getLeftChild(int pos){   //得到左孩子的角标
	if (pos < 0 || pos >= currentSize) {
		cout << "输入数据长度有误" << endl;
		return -1;
	}
	if (isLeftChild(pos)) {
		return pos * 2 + 1;
	}
}

int heapSort::getRightChild(int pos){
	if (pos < 0 || pos >= currentSize) {   //得到右孩子的角标
		cout << "输入数据长度有误" << endl;
		return -1;
	}
	if (isRightChild(pos)) {
		return pos * 2 + 2;
	}
}

int heapSort::getParent(int pos){
	if (pos < 0 || pos >= currentSize) {      //得到父结点的角标
		cout << "输入数据长度有误" << endl;
		return -1;
	}
	return (pos - 1) / 2;
}

int heapSort::deleteValue(int pos){    //删除固定角标的结点
	if (pos < 0 || pos >= currentSize) {
		cout << "输入数据长度有误" << endl;
		return -1;
	}
	int temp = array[pos];
	array[pos] = array[currentSize - 1];
	currentSize--;
	for (int i = currentSize / 2; i > 0; i--) {
		makeHeap(array, pos, currentSize);
	}
	return temp;
}

void heapSort::insertValue(int pos, int data){   //在堆的随意位置插入
	if (pos < 0 || pos >= currentSize) {
		cout << "输入数据长度有误" << endl;
		return ;
	}
	if (currentSize + 1 > maxSize) {
		cout << "当前可插入空间已满无法插入" << endl;
		return;
	}
	currentSize++;
	array[currentSize - 1] = array[pos];
	array[pos] = data;
	for (int i = currentSize / 2; i > 0; i--) {
		makeHeap(array, pos, currentSize);
	}
}

int heapSort::deleteMax(){
	int temp = array[0];   //记录下最大值
	array[0] = array[currentSize - 1];   //为删除的最大值填充成最小的重新排序
	currentSize--;
	for (int i = currentSize / 2; i > 0; i--) {
		makeHeap(array, i, currentSize);
	}
	return temp;
}

void heapSort::makeHeap(int *array, int i, int currentSize) {   //比较排序
	int large = i;
	int left = getLeftChild(i);
	int right = getRightChild(i);
	if (left && array[left] > array[large]) {
		large = left;
	}
	if (right && array[right] > array[large]) {
		large = right;
	}

	if (large != i) {
		int temp = array[i];
		array[i] = array[large];
		array[large] = temp;
		makeHeap(array, large, currentSize);
	}
}

void heapSort::buildHeap(int maxSize) {   //初始化
	array = new int[maxSize];
	this->maxSize = maxSize;
	cout << "请输入要构建的数据大小:" << endl;
	int num = 0;
	cin >> num;
	currentSize = num;
	for (int i = 0; i < currentSize; i++) {
		cin >> array[i];
	}
	for (int i = currentSize / 2; i > 0; i--) {
		makeHeap(array, i, currentSize);   //构造最大堆
	}
}
void heapSort::getResult() {   //输出堆
	int count = 0;
	int rem = -1;
	for (int i = 0; i < currentSize; i++) {
		cout << array[i] << " ";
		if ((i - rem) == pow(2, count)) {
			cout << endl;
			rem = i;
			count++;
		}
	}
	cout << endl;
}

int main() {
	heapSort h;
	int maxsize = 0;
	cout << "请输入您想创建的最大结点值:" << endl;
	cin >> maxsize;
	h.buildHeap(maxsize);
	cout << "输入数据构成的堆是:" << endl;
	h.getResult();
	h.deleteMax();
	cout << endl << "删除最大元素后的堆是:" << endl;
	h.getResult();
	cout << endl << "请输入您想要删除的坐标数字:" << endl;
	int n = 0;
	cin >> n;
	h.deleteValue(n);
	cout << endl << "删除后的结果为:" << endl;
	h.getResult();
	cout << endl << "请输入想要插入的值的角标和值的大小:" << endl;
	int data;
	cin >> n >> data;
	h.insertValue(n, data);
	cout << endl << "插入后的结果是:" << endl;
	h.getResult();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值