the-jj/spl-collections-sort

Spl数据结构的排序辅助库

1.0.3 2017-10-16 10:45 UTC

This package is not auto-updated.

Last update: 2024-09-29 03:06:01 UTC


README

Latest Stable Version Latest Unstable Version Build Status Coverage Status SensioLabsInsight License

提供多种排序SPL数据结构的方法。目前仅支持对象。对于大数组也应该是快速的。

基本用法

所有排序算法都接受对象作为第一个参数,以及可选的比较回调函数作为第二个参数。排序是就地进行的。

插入排序

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::insertionSort($splFixedArray);

var_dump($splFixedArray->toArray()); // [0, 3, 4, 5, 6, 8]

自定义比较函数

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::insertionSort($splFixedArray, function($a, $b) {
    if ($a < $b) return 1;
    if ($a > $b) return -1;
    return 0;
});

var_dump($splFixedArray->toArray()); // [8, 6, 5, 4, 3, 0]

边界

此外,插入排序还接受两个额外的参数 - 边界$low$high

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::insertionSort($splFixedArray, null, 2, 4);

var_dump($splFixedArray->toArray()); // [5, 3, 0, 6, 8, 4]

快速排序

使用非递归实现,这使得它适用于对大数组进行排序。当达到5个元素或更小的子集时,回退到插入排序。

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::quickSort($splFixedArray);

var_dump($splFixedArray->toArray()); // [0, 3, 4, 5, 6, 8]

自定义比较函数

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::quickSort($splFixedArray, function($a, $b) {
    if ($a < $b) return 1;
    if ($a > $b) return -1;
    return 0;
});

var_dump($splFixedArray->toArray()); // [8, 6, 5, 4, 3, 0]

归并排序

使用自下而上(非递归)的实现。

用法?你猜对了

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::mergeSort($splFixedArray);

var_dump($splFixedArray->toArray()); // [0, 3, 4, 5, 6, 8]

自定义比较函数

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::mergeSort($splFixedArray, function($a, $b) {
    if ($a < $b) return 1;
    if ($a > $b) return -1;
    return 0;
});

var_dump($splFixedArray->toArray()); // [8, 6, 5, 4, 3, 0]

数组排序

还有一个排序方法 - 数组排序,它使用PHP的sort()(或usort())方法。用法与上述算法相同

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::arraySort($splFixedArray);

var_dump($splFixedArray->toArray()); // [0, 3, 4, 5, 6, 8]

自定义比较函数

$splFixedArray = SplFixedArray::fromArray([5, 3, 8, 6, 0, 4]);

SplFixedArraySort::arraySort($splFixedArray, function($a, $b) {
    if ($a < $b) return 1;
    if ($a > $b) return -1;
    return 0;
});

var_dump($splFixedArray->toArray()); // [8, 6, 5, 4, 3, 0]

为什么?

当使用常规PHP数组时,我们提供了一个庞大的数组(不是字面上的意思)的排序函数。然而,在原始PHP中,没有为SplFixedArray对象提供类似的功能。

这个就是为了改变这一点。目前它提供了几种排序对象的方法。将来,我可能会添加对其他结构(如双链表)的支持。

安装

composer require the-jj/spl-collections-sort