krak / sorts
v0.1.0
2015-05-07 17:28 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-18 06:41:28 UTC
README
PHP排序算法库。通常,您会想使用PHP的C排序函数,然而,PHP缺少一种稳定的排序算法,这在某些情况下可能很有用。此外,这为社区提供了一个机会,以实现许多其他可能在特定场景中有用的自定义排序。
安装
通过composer安装
{
"repositories": [
{
"type": "vcs",
"url": "https://gitlab.bighead.net/bighead/krak-sorts.git"
}
],
"require": {
"krak/sorts": "~0.1"
}
}
排序算法
Identity Sort
身份排序实际上什么也不做。它只是保留数组不变。这在测试中很有用。
Insertion Sort
这实现了插入排序算法。这是一个稳定的排序。它内存效率高,在大多数已排序的数组和小数据集上表现良好。
Merge Sort
这实现了归并排序算法。我们的实现比大多数实现的空间效率更高。然而,它相对于PHP标准而不是C标准来说更有效率。
Mock Sort
<?php
$sort = new Sorts\MockSort($data);
$sort->sort($other_data, Sorts\PHPCMP);
$other_data === $data; // true
这仅仅是将要排序的数据分配给传入的数据。这在测试中很有用。
StableSort
$sort = new Sorts\StableSort(new Sorts\InsertionSort(), new Sorts\MergeSort(), 20);
这种排序将接受两个稳定的排序(如插入和归并),并根据截止值应用其中一个。如果要排序的数组大小小于截止值,则使用第一个排序,否则使用后者。当您使用插入和归并时,这效果很好,因为当元素少于20个左右时,插入通常比归并排序表现更好。
用法
排序库有两种不同的API。
面向对象接口
每个排序都被定义为实现了以下接口的类
<?php
namespace Krak\Sorts;
interface Sort
{
/**
* @param &$vals an array like object
* @param string|\Closure $cmp a comparison function
*/
public function sort(&$vals, $cmp);
}
您可以使用这些中的任何一个来执行排序。
new IdentitySort()
new InsertionSort()
new MergeSort()
new MockSort(mixed $data_to_assign)
new StableSort(Sort $few_sort, Sort $many_sort, int $cutoff_value)
功能接口
或者,您可以使用更易于使用的功能接口。
void sorts\stable(mixed &$data, $cmp = sorts\PHPCMP)
void sorts\insertion(mixed &$data, $cmp = sorts\PHPCMP)
void sorts\merge(mixed &$data, $cmp = sorts\PHPCMP)
定义了三个用于排序的常量
PHPCMP
这使用<
和>
对支持这些运算符的任意对象应用比较STRCMP
这是strcmp
函数INTCMP
这只是$a
和$b
之间的差异
您可以在源代码中查看这些比较函数的参考。
比较函数
有效的比较是任何可以用这些 ()
调用的变量。因此,如果 $cmp($a, $b)
不抛出错误,那么它是一个有效的比较。这些比较与PHP比较定义完全兼容(相同)。