C++手写堆
大顶堆,重要的就是插入和弹出最大值。所以重在上浮和下沉。
用一个数组来表示,按照完全二叉树的格式,当前节点的序号为i(从0开始),则左孩子的序号为2i+1,右孩子的序号为2i+2,父节点为(i-1)/2。插入即上浮的过程,就是节点与父节点不断比较。弹出后重排序,即下沉的过程,不断与左右子节点比较。
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class heapSort
{
public:
heapSort(){}
virtual ~heapSort(){}
void push(const T num)
{
nums.emplace_back(num);
int index = nums.size()-1;
while(nums[index] > nums[(index-1)/2]){
swap(nums[index],nums[(index-1)/2]);
index = (index-1)/2;
}
}
void heapify()
{
}
void top()
{
return static_cast<T>(nums.front());
}
const T pop()
{
T top = nums.front();
swap(nums.front(),nums.back());
nums.pop_back();
int index=0;
int left = 2*index+1;
int heapsize = nums.size();
while(left<heapsize){
int larger = left+1<heapsize && nums[left+1]>nums[left] ? left+1:left;
int largest = nums[larger]>nums[index]?larger:index;
if(largest==index){
break;
}
swap(nums[largest],nums[index]);
index=largest;
left=2*index+1;
}
cout<<"pop"<<top<<endl;
return top;
}
private:
vector<T> nums;
};
int main()
{
/*
vector<int> nums = {1,2,3,4};
vector< vector<int> > nums2 = {{1,2},{3,4}};
for(const int &num:nums){
cout<<num<<' ';
}
cout<<endl;
char c = 10;
cout<<static_cast<int>(c)<<endl;
*/
heapSort<int> hs;//指定类型
hs.push(1);
hs.push(2);
hs.push(3);
cout<<static_cast<int>(hs.pop())<<endl;
cout<<static_cast<int>(hs.pop())<<endl;
cout<<static_cast<int>(hs.pop())<<endl;
return 0;
}
并查集
//查找
int find(int x)
{
return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
//合并
inline void merge(int i, int j)
{
fa[find(i)] = find(j);
}