概念解释
堆排序是《数据结构与算法》中介绍的一种排序算法, 在PHP的标准库中也有实现:
1. SplHeap, 堆, 可用于堆排序, 然后通过foreach读取, 他有两个子类SplMinHeap和SplMaxHeap
2. SplMinHeap, 小根堆, 数值/权重/优先级等越小, 通过foreach读取时, 越靠前
3. SplMaxHeap, 大根堆, 跟小根堆相反
4. SplPriorityQueue, 优先级队列, 文档中说明是基于大根堆实现的
用法参考
SplMinHeap用法
$ls = [
['time' => '2023-6-27 14:07:59', 'name' => '张'],
['time' => '2023-6-27 14:08:39', 'name' => '李'],
['time' => '2023-6-27 14:08:56', 'name' => '王'],
['time' => '2023-6-27 14:08:36', 'name' => '赵'],
['time' => '2023-6-27 14:08:44', 'name' => '孙'],
['time' => '2023-6-27 14:08:59', 'name' => '刘'],
['time' => '2023-6-27 14:09:05', 'name' => '黄'],
['time' => '2023-6-27 14:09:08', 'name' => '曹'],
['time' => '2023-6-27 14:09:02', 'name' => '罗'],
];
//需要先继承标准类, 然后按自己需要重写compare方法, 标准类中compare()方法是protected
class myMinHeap extends splMinHeap{
public function compare($v1, $v2) {
return -strcmp($v1['time'], $v2['time']);
}
}
$q = new myMinHeap();
foreach ($ls as $v) {
$q->insert($v);
}
foreach ($q as $v) {
echo $v['name'].' - '. $v['time'].'<br>';
}
打印结果(按时间正序):
张 - 2023-6-27 14:07:59
赵 - 2023-6-27 14:08:36
李 - 2023-6-27 14:08:39
孙 - 2023-6-27 14:08:44
王 - 2023-6-27 14:08:56
刘 - 2023-6-27 14:08:59
罗 - 2023-6-27 14:09:02
黄 - 2023-6-27 14:09:05
曹 - 2023-6-27 14:09:08
SplPriorityQueue用法
$ls = [
['time' => '2023-6-27 14:07:59', 'name' => '张'],
['time' => '2023-6-27 14:08:39', 'name' => '李'],
['time' => '2023-6-27 14:08:56', 'name' => '王'],
['time' => '2023-6-27 14:08:36', 'name' => '赵'],
['time' => '2023-6-27 14:08:44', 'name' => '孙'],
['time' => '2023-6-27 14:08:59', 'name' => '刘'],
['time' => '2023-6-27 14:09:05', 'name' => '黄'],
['time' => '2023-6-27 14:09:08', 'name' => '曹'],
['time' => '2023-6-27 14:09:02', 'name' => '罗'],
];
$q = new SplPriorityQueue();
foreach ($ls as $v) {
$q->insert($v, strtotime($v['time']));
}
foreach ($q as $v) {
echo $v['name'].' - '. $v['time'].'<br>';
}
输出结果(按时间倒序):
曹 - 2023-6-27 14:09:08
黄 - 2023-6-27 14:09:05
罗 - 2023-6-27 14:09:02
刘 - 2023-6-27 14:08:59
王 - 2023-6-27 14:08:56
孙 - 2023-6-27 14:08:44
李 - 2023-6-27 14:08:39
赵 - 2023-6-27 14:08:36
张 - 2023-6-27 14:07:59
用法总结
1. 主要是重写父类的compare()方法时要注意返回值
2. 插入元素用 insert() 方法
3. 用foreach读取数据 (也可以用while 结合 next() valid()等自带方法去读取)