前言
大二上我选修了C++课,因为这门语言我从未学到其精妙之处,所以想要好好学一学。由于平时学业比较繁重,我没有时间将做过的四门实验与大作业发布到博客上。因此,趁着寒假空闲时间,我将落下的几篇博文一一补上。
第一个实验是用C++实现堆排序。虽然C++的STL库可以直接调用优先队列,实现与堆排序相同的功能,但是堆的思想还是有必要好好学一学。不过对我而言,都是学过的东西,稍微回忆一下也都记得个大概,敲起来也并不费事。
原理
首先将需要排序的所有元素建立成一个大顶堆。根据大顶堆的定义,父节点上的元素必然大于其子节点上的元素,因此在堆顶上的元素是堆中最大的。然后依次弹出堆顶的元素,即可得到一个有序的数组。
实现
方法
建立大顶堆的时候,每次从堆底插入新元素,然后与其父节点比较,如果小于其父节点则不变。如果该节点大于其父节点,则与其父节点进行交换,然后再与新的父节点进行比较,重复上述操作直至小于父节点或者达到堆顶。
删除堆顶元素时,将堆顶元素与堆底元素进行交换。然后维护剩下元素的大顶堆。将新的堆顶元素与其子节点中较大的那个进行比较,如果该元素比子节点小,则进行交换,然后重复上述操作,直到该元素比它的两个子节点都要大或者达到堆底。
代码
1 |
|
运行结果
总结
听说了函数模板这种东西之后,才惊觉stl库中的那些函数是通过这样的泛型编程实现的。
不过函数模板需要每个函数前都来那么一句,稍微有那么一点不是很舒服。
C++函数对于参数的灵活性调用也让我大吃一惊,虽然在此次实验中并没有体现到。