krak/sorts

PHP实现的一系列排序算法的集合

v0.1.0 2015-05-07 17:28 UTC

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比较定义完全兼容(相同)。