2016年9月

快速排序

PHP实现

$arr = [72,6,57,88,60,42,83,73,48,85];

function quickSort(&$arr, $left , $right) {
    if ($left >= $right) {
        return;
    }
    $r     = $right;
    $l     = $left;
    $judge = $left; // 基准数下标
    $index = $judge; // 上一个'位置'索引
    $key   = $arr[$judge];
    while ($l < $r) {
        // 从后往前找, 比基准数小的
        while ($l < $r && $arr[$r] > $key) {
            $r--;
        }
        $arr[$index] = $arr[$r];
        $index = $r;
        // 从前往后找, 比基准数大的
        while ($l < $r && $arr[$l] <= $key) {
            $l++;
        }
        $arr[$index] = $arr[$l];
        $index = $l;
    }
    $arr[$index] = $key;
    // 左区间
    quickSort($arr, $left , $index - 1);
    // 右区间
    quickSort($arr, $index + 1 , $right);
}

quickSort($arr, 0, count($arr) - 1);
printArr($arr);

function printArr(&$arr) {
    foreach ($arr as $li) {
        echo $li . ' ';
    }
    echo PHP_EOL;
}

日期与时间扩展类 - DateTime / DateTimeInterface / DateTimeZone / DateInterval

date_default_timezone_set('PRC');

$dateTime = new DateTime();
p($dateTime->format('Y-m-d H:i:s')); // 当前时间

// DateTime::add
$dateInterval = new DateInterval('P1YT3H'); // 给时间对象增加1年3小时
$dateTime->add($dateInterval);
p($dateTime->format('Y-m-d H:i:s')); // 格式化时间,参数与 date() 接受的参数一致

// DateTime::sub
$dateTime->sub($dateInterval); // 给时间对象减少1年3小时
p($dateTime->format('Y-m-d H:i:s'));

// DateTime::modify
$dateTime->modify('+1 day'); // 修改时间对象,参数与 strtotime() 接受的参数一致
p($dateTime->format('Y-m-d H:i:s'));

// DateTime::setDate
$dateTime->setDate('2016','9','16'); // 三个参数分别表示 "年" "月" "日"

// DateTime::setTime
$dateTime->setDate('0','0','0'); // 三个参数分别表示 "时" "分" "秒"

// DateTime::setTimeStamp
$dateTime->setTimeStamp(time()); 

// DateTime::setTimeZone
$dateTime->setTimeZone(new DateTimeZone('PRC')); // 设置时区

// DateTimeInterface::diff
$dateTime2 = new DateTime();
$dateInterval = $dateTime->diff($dateTime2); // 求两个时间对象之差,返回DateInterval对象
echo $dateInterval->format('相差 %Y 年 %M 月 %D 天, %H 小时 %I 分钟 %S 秒 ');

// DateTimeInterface::getOffect
echo $dateTime->getOffset(); // 获取当前时间对象对UTC时间的偏移 , 参考date('Z');

// DateTimeInterface::getTimeStamp
echo $DateTime::getTimeStamp();

// DateTImeInterface::getTimeZone
echo $dateTime->getTimeZone();

// DateInterval::__construct
$dateInterval = new DateInterval('P1Y');
/*
参数是一个特殊格式的字符串 : P开头,表示'period'
Y表示年;M表示月;D表示天;W表示星期;H表示小时;M表示分;S表示秒, 在字母前面加上数字即可 , 注意顺序不能调换
比如 'P1Y2M3D' 表示1年2个月3天, 'P3D1Y2M' 则错误

如果要表示时间,要加上"T"
比如 'P1Y2M3DT1H1M1S', 当有H,M,S要表示时, 要在Y,M,D后面,H,M,S前面加上T
*/

// DateInterval::format
$dateInterval->format('%y %m %d $h %i $s'); // 大写表示结果补零,比如 01