PHP自带的堆排序用法介绍(SplHeap,SplMinHeap,SplMaxHeap,SplPriorityQueue)

概念解释

堆排序是《数据结构与算法》中介绍的一种排序算法, 在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()等自带方法去读取)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值