更新此快速排序算法以处理特定键的排序

时间:2017-09-10 20:16:28

标签: php algorithm sorting

我相信如果你处理完全混乱的数据集,quicksort是处理排序的最佳方法之一。我想更新以下代码来处理带有键的数组,这样它就可以对与单个数组中的值相对的数组列表进行排序。

function quicksort($array) {
    if (count($array) == 0)
            return array();

        $pivot = $array[0];
        $left = $right = array();

        for ($i = 1; $i < count($array); $i++) {
            if ($array[$i] < $pivot)
                $left[] = $array[$i];
            else
                $right[] = $array[$i];
        }
        return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, ''));
}

2 个答案:

答案 0 :(得分:1)

使用usort()anonymous function

<?php
$arr = array(
    array("val" => 10, "something" => "zzz", "val2" => 1110),
    array("val" => 111, "something" => "aaa", "val2" => 1),
    array("val" => 1, "something" => "bbb", "val2" => 12),
    array("val" => 14, "something" => "eee", "val2" => 31),
    array("val" => 2, "something" => "ccc", "val2" => 11),
);

usort($arr, function ($a, $b) {
    if ($a['val2'] > $b['val2']) {
        $result = 1;
    } elseif ($a['val2'] < $b['val2']) {
        $result = -1;
    } else {
        $result = 0;
    }
    return $result;
});

var_dump($arr);

尝试考虑排序策略设计模式

<?php
class SortStrategy
{
    public $key;

    public function __construct($key)
    {
        $this->key = $key;
    }

    public function cmp($a, $b)
    {
        return ($a[$this->key] > $b[$this->key]) ? 1 : (($a[$this->key] < $b[$this->key]) ? -1 : 0);
    }
}

$arr = array(
    array("val" => 10, "something" => "zzz", "val2" => 1110),
    array("val" => 111, "something" => "aaa", "val2" => 1),
    array("val" => 1, "something" => "bbb", "val2" => 12),
    array("val" => 14, "something" => "eee", "val2" => 31),
    array("val" => 2, "something" => "ccc", "val2" => 11),
);

// sort by val2 key
$objSortStrategy = new SortStrategy('val2');
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

// sort by val key
$objSortStrategy->key = 'val';
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

// sort by something key
$objSortStrategy->key = 'something';
usort($arr, [$objSortStrategy, 'cmp']);
var_dump($arr);

注意:这只是一个给你一些想法的简单例子

答案 1 :(得分:0)

好的解决了。我编辑了一个快速排序并开始工作:

@PreAuthorize("hasPermission(#employee, 'edit')")
public void editEmployee(Employee employee) {
   ...
}

@Component
public class PermissionEvaluatorImpl implements PermissionEvaluator {
    @Override
    public boolean hasPermission(Authentication auth,
            Object targetDomainObject, Object permission) {
        // return true if "auth" has "permission" permission for the user.
        // Current-user can be obtained from auth.
    }
    ...
}

样品:

public static function quicksort($array, $key = '')
{
    if ($key) {
        if (count($array) == 0)
            return array();

        $pivot = $array[0];
        $left = $right = array();

        for ($i = 1; $i < count($array); $i++) {
            if ($array[$i][$key] < $pivot[$key])
                $left[] = $array[$i];
            else
                $right[] = $array[$i];
        }
        return array_merge(self::quicksort($left, $key), array($pivot), self::quicksort($right, $key));

    } else {

        if (count($array) == 0)
            return array();

        $pivot = $array[0];
        $left = $right = array();

        for ($i = 1; $i < count($array); $i++) {
            if ($array[$i] < $pivot)
                $left[] = $array[$i];
            else
                $right[] = $array[$i];
        }
        return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, ''));

    }
}