目录
heap
void test1(){
vector<int> min={10,30,22,6,15,9};
//建立小顶堆
make_heap(min.begin(), min.end(), greater<int>());
printHeap(min);//6 10 9 30 15 22
//插入元素
min.push_back(20);
push_heap(min.begin(),min.end(), greater<int>());//该算法前提:必须在堆的条件下
printHeap(min); //6 10 9 30 15 22 20 仍为小顶堆
//删除堆顶元素
pop_heap(min.begin(),min.end(), greater<int>());
printHeap(min);//9 10 20 30 15 22 6 不为小顶堆 这个pop_heap操作后,实际上是把堆顶元素放到了末尾
min.pop_back();//这才彻底在底层vector数据容器中删除
printHeap(min);//9 10 20 30 15 22 仍为小顶堆
/**
堆排序 保持greater,小顶堆,得到的是降序
注意结果是降序的哦!!!其实是调用了很多次pop_heap(...,greater..),
每一次都把小顶堆堆顶的元素往末尾放,没放一次end迭代器减1
*/
sort_heap(min.begin(),min.end(), greater<int>());
printHeap(min);//30 22 20 15 10 9
// 大顶堆,以及堆排序为升序的例子
// 把上面code里所有的第三个参数改为less<int>()。
}
void test2(){
vector<int> min={10,30,22,6,15,9};
//建立大顶堆
make_heap(min.begin(), min.end(), less<int>());
printHeap(min);//30 15 22 6 10 9
//插入元素
min.push_back(20);
push_heap(min.begin(),min.end(), less<int>());//该算法前提:必须在堆的条件下
printHeap(min); //6 10 9 30 15 22 20 仍为大顶堆
sort_heap(min.begin(),min.end(), less<int>());
printHeap(min);//30 22 20 15 10 9
}
自定义对象建堆
//大顶堆
bool compare_person(Person p1,Person p2){
return p1.age < p2.age;
}
//小顶堆
//bool compare_person(Person p1,Person p2){
// return p1.age > p2.age;
//}
//这样做不起任何作用,如何对自定义对象进行排序???
void test3(){
Person p0 = Person(10,"tom0");
Person p1 = Person(11,"tom1");
Person p2 = Person(12,"tom2");
Person p3 = Person(9,"tom3");
vector<Person> persons ={p0,p1,p2,p3};
make_heap(persons.begin(), persons.end(), compare_person);
printHeap(persons);
sort_heap(persons.begin(), persons.end(), compare_person);
printHeap(persons);
}
行者常至,为者常成!