经典排序算法

  1. 冒泡
$arr = array(3,44,38,5,47,15,36,26,27,2,46,4,19,50,48);
$arr = array(2,3,4,5,15,19,26,27,36,38,44,46,47,48,50);
$times = 0;//记录比较的次数
$len=count($arr);
//控制需要冒泡的轮数
for($i=1;$i<$len;$i++){
  $swapped = false;//[优化]跳出循环之用
  //控制每轮 冒出一个数 需要比较的次数
  for($k=0;$k<$len-$i;$k++){
    $times += 1;
    if($arr[$k]>$arr[$k+1]){
      $tmp=$arr[$k+1];
      $arr[$k+1]=$arr[$k];
      $arr[$k]=$tmp;
      $swapped = true;
    }
  }
  $times += 1;
  if(!$swapped)
    break;
}
echo $times;print_r($arr);

冒泡排序无论代码怎么实现,交换的次数是同样。不同的是,设计良好的算法对于排序良好的输入,进行比较的次数会骤减。

  1. 插入排序
function insert_sort(&$arr){
    $sum = count($arr);
    for($i=1;$i<$sum;$i++){
        $tmp=$arr[$i];
        $key=$i-1;
        while($key>=0 && $tmp<$arr[$key]){
            $arr[$key+1]=$arr[$key];
            $key--;
        }
        $key != $i-1 && $arr[$key+1] = $tmp;//如果有移动,就插入
    }
}
  1. 希尔排序
function shell_sort(&$arr)
{
    if(!is_array($arr)) return;
    $n = count($arr);
    for($gap=floor($n/2);$gap>0;$gap=floor($gap/=2))
    {
        for($i=$gap;$i<$n;++$i)
        {
            for($j=$i-$gap;$j>=0 && $arr[$j+$gap]<$arr[$j];$j-=$gap)
            {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+$gap];
                $arr[$j+$gap] = $temp;
            }
        }
    }
}
  1. 选择排序
function selection_sort(&$array){
    $count=count($array);
    for($i=0;$i<$count-1;$i++){
        /*findtheminest*/
        $min=$i;
        echo'$min-->'.$array[$min].'-->';
        for($j=$i+1;$j<$count;$j++){
            //由小到大排列
            if($array[$min]>$array[$j]){
                //表明当前最小的还比当前的元素大
                $min=$j;
                //赋值新的最小的
            }
        }
        echo$array[$min].'coco<br/>';
        /*swap$array[$i]and$array[$min]即将当前内循环的最小元素放在$i位置上*/
        if($min!=$i){
            $temp=$array[$min];
            $array[$min]=$array[$i];
            $array[$i]=$temp;
        }
    }
}
  1. 快速排序
function quickSort($arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $size=count($arr);
        for($i=1;$i<$size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x = quickSort($x);
        $y = quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return $arr;
    }
}
  1. 选择排序
function selectSort(&$arr){
    $n = count($arr);
    for($i=0; $i<$n-1; $i++){
        $min_k = $i;
        $min_v = $arr[$i];
        for($j = $i+1; $j<$n; $j++){
            if($arr[$j] < $min_v){
                $min_v = $arr[$j];
                $min_k = $j;
            }
        }
        $arr[$min_k] = $arr[$i];
        $arr[$i] = $min_v;
    }
}

随时分享一些小工具

1. 一行js代码,做一个浏览器书签,一个简单生硬的计算器就出来了

1.png

实现非常简单,书签管理器添加一个书签,url处填上

javascript:    var e = "", r="";    do {      e = prompt("表达式: " + e + "\n" + r + "\n", e);      try { r = "计算结果: " + eval(e); }      catch(ex) { r = ex; }    } while(e);    void 0;

2.png

weibo实习5个月学习成长简短总结

2015年1月13日入微博实习,迄今已有5个月之久,且说说自己学习成长收获。
整个实习期间只做了一个投票产品,工作上还是比较轻松的。所以不以时间为线索来谈,直接说说学习到哪些干货吧。
我主要做投票pc端、h5端、feed的落地页。

  1. 单一个落地页需要处理展现的信息就比较多,包括发起人、好友参与(双向关系)、投票本身、投票选项、话题信息、相关投票等等。投票的状态有:主他 * 是否结束 * 是否参与 * 结果是否可见 * 图文 等十多种。
  2. 是多端的细节处理和ajax接口提供,h5要在微博客户端上有很多要协调处理之处。
  3. 微博投票系二级内容产品,涉及对象库、配置平台、主站的多方协作,同时兼顾业务、产品的需求,整个开发调试过程也是比较锻炼人的。
  4. 再小的问题,当你考虑大并发量的时候,都不再是简单的问题。要设计memcache缓存、程序内缓存,设计参与投票走mcq队列,假数据输出。

HTML,CSS,Javascript接触不多,但以前自学过,掌握还算可以。
关于PHP,微博投票两次版本分别应用了kohana、yaf框架,so我学习了两套框架的设计思路,路由的设计等。学会了原生的模版写法:
MVC设计中,假设controller中数据准备$items变量,然后赋值给模板,再渲染、response。

<?php
...
Class Controller_Items extends Controller{
    public function listAction(){
        $items = Model::Factory('items')->select()->limit(5)->execute();
        $this->assign('items',$items);
    }
}

在模板文件中应该是这样的:

<?php foreach($items as $k=>$item): ?>
    <p>this is item <?=$K?>, it's value is <?=$item['value']?></p>
<?php endforeach; ?>

PHP编译安装:configure make make test & make install
PDO作为PHP扩展为PHP访问数据库定义了一个轻量级的一致接口,而PDO_MYSQL扩展则实现了PDO接口,来连接mysql数据库。当然PDO的出现,是为了使PHP能平滑游走在诸多RDBMS中,所以我们只要选择不同的数据库驱动扩展来实现PDO就可以了。
对Apache/Nginx见此的编译、安装、配置基本掌握。
Linux的管道、strace系统调用、关于log的tail -f 等调试技术的学习
还有一个主要的成长就是写代码的功力:

  • 代码重用
    投票落地页涉及多端展现,但处理逻辑大体上是一致的,所以在基本完成pc、h5的controller处理逻辑时,翔哥让我把多端共用的逻辑提炼出来放到ModelPoll_Comm类里。之后再做修改时,真的体会到代码重用的好处和必要性。

  • 数据迁移
    投票产品的这次新改版不止前端优化更改,后端的数据库设计、PHP框架都有所变更,并且迁移要保证在用户无感知的情况下完成,所以要明确整个迁移的流程by宇哥,物理迁移、逻辑迁移,开启双写,迁移后,队列缓存数据写入等。

  • PHP架构设计
    主要分yaf路由、models、modules、library、data、config几个部分。核心路由功能,在config 中配置,交由yaf完成;modules是应用模块,包括pc、h5、cli、openapi、internal、API等;models与data配合,关于数据的增删查改处理逻辑;library提供应用使用的各种类库。

以上只是就学到的方面做个简短说明,其实还学习到很多,好的坏的嘎嘎,就不说了~

---------- 以下情怀,高能勿入 ----------

首先感谢牛总,给机会,给予支持和理解。感谢翔哥宇哥给予教导。感谢峰哥,感谢宗稳
感谢台网团队,给成长锻炼的机会,(吃了好多顿免费的午餐~~)
热爱coding,但coding不是全部,运营、产品都是非常重要的。一个好的工程师绝不是一个码农,有责任心,擅于沟通,嗯,加油!

2015.4.21流水日记

起得颇早,乘公交,8点半到公司。
9点开始准备,与jser联调的测试数据~
10点联调
12点去吃午饭,回来坐一会。
14点正式开工,自己调试。
调调歇歇,19点下班,乘公交回学校。
东门买些小吃,回到宿舍。
歇会,9点用室友电脑,玩了一把LOL。
快10点躺床休息下,逗比室友们玩起了成语接龙。
十多分钟后,产生的一个结论是:重庆的语文教育止于小学。hiahia
下床准备一下明天的《系统工程学》考试,没多久困得不行,躺床睡了~~~~

一个PHP分页类-支持URL普通模式和PATHINFO模式

分页实现是网站应用最常用的功能,需要注意的是,要和网站的url模式相一致,且不丢失其他GET参数。再次就是要可以配置你的分页主题。这里我整理了一个分页类,调用非常简单,demo如下:
场景:写了一个微信精选的文摘,有分页功能,URL模式就是普通模式"?a=bc&page=2",若你的程序是PATHINTO模式的,实例化Page类时配置一下$urlmode=1就可以生成形如"./a/bc/page/2"的URL。分页类首要知道你的总数和每页的个数就可以了。话不多说,直接看代码加注释
应用代码摘取:

require './DMysqli.php';//数据库类
$dbconfig = array('hostname'=>SAE_MYSQL_HOST_M,'username'=>SAE_MYSQL_USER,'password'=>SAE_MYSQL_PASS,'database'=>SAE_MYSQL_DB,'hostport'=>SAE_MYSQL_PORT,'tablePrefix'=>'wx_');
$dmysqli = new DMysqli($dbconfig);
header('Content-type: text/html; charset=utf-8');
require 'Util/page.class.php';//引入Page分页类
$sql = 'select count(*) from wx_article';
$count = $dmysqli->query($sql);//总数
$totalRow = intval(current($count[0]));
$Page = new Page($totalRow,10);//实例化分页类:配置总数、每页个数
$sql = 'select * from wx_article ORDER BY posttime,id desc LIMIT $Page->firstRow'.','.'$Page->listRows';//取出当前页的数据,关键在sql语句的limit语法
$res = $dmysqli->query($sql);
/*
//分页语种自定义
$Page-&gt;setConfig('header','items');
$Page-&gt;setConfig('prev','Prev Page');
$Page-&gt;setConfig('next','Next Page');
$Page-&gt;setConfig('first','First Page');
$Page-&gt;setConfig('last','Last Page');
$Page-&gt;setConfig('theme',' %totalRow% %header% %nowPage%/%totalPage% Page %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end%');
*/
$show = $Page-&gt;show();//分页类可以生成分页字符串,然后赋值给变量,在模版里输出就好了!
include('template/index.html');

Page类源码如下:

class Page {
    // 分页栏每页显示的页数
    public $rollPage = 4;
    // 页数跳转时要带的参数
    public $parameter;
    // 当url模式为PATHINFO时,此配置项有效
    public $depr = '/';
    // 分页URL地址
    public $url = '';
    // 默认列表每页显示行数
    public $listRows = 20;
    // 起始行数
    public $firstRow;
    // 分页总页面数
    protected $totalPages;
    // 总行数
    protected $totalRows;
    // 当前页数
    protected $nowPage;
    // 分页的栏的总页数
    protected $coolPages;
    // 分页显示定制
    protected $config = array (
            'header' => '条',
            'prev' => '上一页',
            'next' => '下一页',
            'first' => '第一页',
            'last' => '最后一页',
            'theme' => ' %totalRow% %header% %nowPage%/%totalPage% 页 %upPage% %downPage% %first%  %prePage%  %linkPage%  %nextPage% %end%' 
    );
    // 默认分页变量名
    protected $varPage;
    // url模式:0 普通模式 1 PATHINFO模式
    protected $urlmode;
    
    /**
     * 架构函数
     * 
     * @access public
     * @param array $totalRows
     *          总的记录数
     * @param array $listRows
     *          每页显示记录数
     * @param array $parameter
     *          分页跳转的参数
     *          
     */
    public function __construct($totalRows, $listRows = '', $parameter = '', $url = '', $urlmode = 0) {
        $this->totalRows = $totalRows;
        $this->parameter = $parameter;
        $this->varPage = 'page';
        if (! empty ( $listRows )) {
            $this->listRows = intval ( $listRows );
        }
        $this->totalPages = ceil ( $this->totalRows / $this->listRows ); // 总页数
        $this->coolPages = ceil ( $this->totalPages / $this->rollPage );
        $this->nowPage = ! empty ( $_GET [$this->varPage] ) ? intval ( $_GET [$this->varPage] ) : 1;
        if (! empty ( $this->totalPages ) && $this->nowPage > $this->totalPages) {
            $this->nowPage = $this->totalPages;
        }
        $this->firstRow = $this->listRows * ($this->nowPage - 1);
        
        $this->urlmode = $urlmode;
    }
    public function setConfig($name, $value) {
        if (isset ( $this->config [$name] )) {
            $this->config [$name] = $value;
        }
    }
    
    /**
     * 分页显示输出
     * 
     * @access public
     *        
     */
    public function show() {
        if (0 == $this->totalRows)
            return '';
        $p = $this->varPage;
        $nowCoolPage = ceil ( $this->nowPage / $this->rollPage );
        
        // 分析分页参数
        if ($this->parameter && is_string ( $this->parameter )) {
            parse_str ( $this->parameter, $parameter );
        } elseif (empty ( $this->parameter )) {
            // unset($_GET[C('VAR_URL_PARAMS')]);
            if (empty ( $_GET )) {
                $parameter = array ();
            } else {
                $parameter = $_GET;
            }
        }
        $parameter [$p] = '__PAGE__';
        if ($this->urlmode == 0) { // 普通模式URL转换
            $url = "?" . http_build_query ( $parameter );
        } else { // PATHINFO模式或者兼容URL模式
            $url = ".$this->depr";
            if (! empty ( $parameter )) { // 添加参数
                foreach ( $parameter as $var => $val ) {
                    if ('' !== trim ( $val ))
                        $url .= $var . $this->depr . urlencode ( $val );
                }
            }
        }
        // 上下翻页字符串
        $upRow = $this->nowPage - 1;
        $downRow = $this->nowPage + 1;
        if ($upRow > 0) {
            $upPage = "<a href='" . str_replace ( '__PAGE__', $upRow, $url ) . "'>" . $this->config ['prev'] . "</a>";
        } else {
            $upPage = '';
        }
        
        if ($downRow <= $this->totalPages) {
            $downPage = "<a href='" . str_replace ( '__PAGE__', $downRow, $url ) . "'>" . $this->config ['next'] . "</a>";
        } else {
            $downPage = '';
        }
        unset ( $upPage );
        unset ( $downPage );
        
        // << < > >>
        if ($nowCoolPage == 1) {
            $theFirst = '';
            $prePage = '';
        } else {
            $preRow = $this->nowPage - $this->rollPage;
            $prePage = "<a href='" . str_replace ( '__PAGE__', $preRow, $url ) . "' >上" . $this->rollPage . "页</a>";
            $theFirst = "<a href='" . str_replace ( '__PAGE__', 1, $url ) . "' >" . $this->config ['first'] . "</a>";
        }
        if ($nowCoolPage == $this->coolPages) {
            $nextPage = '';
            $theEnd = '';
        } else {
            $nextRow = $this->nowPage + $this->rollPage;
            $theEndRow = $this->totalPages;
            $nextPage = "<a href='" . str_replace ( '__PAGE__', $nextRow, $url ) . "' >下" . $this->rollPage . "页</a>";
            $theEnd = "<a href='" . str_replace ( '__PAGE__', $theEndRow, $url ) . "' >" . $this->config ['last'] . "</a>";
        }
        // 1 2 3 4 5
        $linkPage = "";
        for($i = 1; $i <= $this->rollPage; $i ++) {
            $page = ($nowCoolPage - 1) * $this->rollPage + $i;
            if ($page != $this->nowPage) {
                if ($page <= $this->totalPages) {
                    $linkPage .= "&nbsp;<a href='" . str_replace ( '__PAGE__', $page, $url ) . "'>&nbsp;" . $page . "&nbsp;</a>";
                } else {
                    break;
                }
            } else {
                if ($this->totalPages != 1) {
                    $linkPage .= "&nbsp;<span class='current'>" . $page . "</span>";
                }
            }
        }
        $pageStr = str_replace ( array (
                '%header%',
                '%nowPage%',
                '%totalRow%',
                '%totalPage%',
                '%upPage%',
                '%downPage%',
                '%first%',
                '%prePage%',
                '%linkPage%',
                '%nextPage%',
                '%end%' 
        ), array (
                $this->config ['header'],
                $this->nowPage,
                $this->totalRows,
                $this->totalPages,
                $upPage,
                $downPage,
                $theFirst,
                $prePage,
                $linkPage,
                $nextPage,
                $theEnd 
        ), $this->config ['theme'] );
        return $pageStr;
    }
}