C++堆排序代码

#ifndef HEAP_H
#define HEAP_H

#include <stdlib.h>
#include <memory.h>

template<class T>
class Heap		// 依赖<运算
{
public:

	Heap():m_data(0), m_size(0), m_max_size(0)
	{
		Resize(128);
	}

	~Heap()
	{
		if (m_data != 0)
			free(m_data);
	}

	void Push(const T &val)
	{
		if (m_size == m_max_size) Resize(m_max_size * 2);

		int s = m_size;
		++m_size;
		while(s > 0)
		{
			int f = (s - 1) / 2;
			if (!(val < m_data[f])) break;

			m_data[s] = m_data[f];
			s = f;
		}
		m_data[s] = val;
	}

	void PopFront()
	{
		if (m_size == 0) return ;

		--m_size;

		if (m_size == 0) return ;

		T tmp = m_data[m_size];
		int f = 0;
		int half_size = m_size / 2;
		while(f < half_size)
		{
			int s = f * 2 + 1;
			if (s + 1 < m_size && m_data[s + 1] < m_data[s]) ++s;

			if (!(m_data[s] < tmp)) break;

			m_data[f] = m_data[s];
			f = s;
		}
		m_data[f] = tmp;
	}

	T & Front() { return m_data[0];	}
	bool Front(T *v)
	{
		if (m_size != 0)
		{
			*v = m_data[0];
			return true;
		}
		return false;
	}
	int Size() { return m_size; }
	void Clear() { m_size = 0; }

protected:
	T *m_data;
	int m_size;
	int m_max_size;

	void Resize(int size)
	{
		if (size <= m_max_size) return;
		T *new_data = (T*)malloc(size * sizeof(T));
		if (m_data != 0)
		{
			memcpy(new_data, m_data, m_size * sizeof(T));
			free(m_data);
		}
		m_data = new_data;
		m_max_size = size;
	}
};

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用C++实现的堆排序代码示例: ```cpp #include <iostream> using namespace std; // 调整堆,使其满足最大堆性质 void heapify(int arr[], int n, int i) { int largest = i; // 初始化根节点索引为最大值索引 int left = 2 * i + 1; // 左子节点索引 int right = 2 * i + 2; // 右子节点索引 // 如果左子节点比根节点大,则更新最大值索引 if (left < n && arr[left] > arr[largest]) largest = left; // 如果右子节点比最大值大,则更新最大值索引 if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值不是根节点,则交换根节点和最大值,并递归调整交换后的子树 if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } } // 堆排序函数 void heapSort(int arr[], int n) { // 构建最大堆,从最后一个非叶子节点开始进行调整 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // 依次将堆顶元素与当前堆的最后一个元素交换,并重新调整堆 for (int i = n - 1; i > 0; i--) { swap(arr[0], arr[i]); // 将最大值移到堆尾 heapify(arr, i, 0); // 重新调整堆 } } // 打印数组 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) cout << arr[i] << " "; cout << endl; } int main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int n = sizeof(arr) / sizeof(arr[0]); cout << "原始数组: "; printArray(arr, n); heapSort(arr, n); cout << "排序后的数组: "; printArray(arr, n); return 0; } ``` 这个代码示例实现了堆排序算法,首先构建最大堆,然后依次将堆顶元素与当前堆的最后一个元素交换,并重新调整堆。最后输出排序后的数组。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值