JHHK

欢迎来到我的个人网站
行者常至 为者常成

24、heap

目录

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);
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.