php 实现计数排序

算法还是很重要嘀~
直接贴代码:

<?php
/*
 * count_sort.php 计数排序
 * cli 模式运行 php count_sort.php 3 4 5 6 3 2 4 56 4 3 2 8 1
 */
$a = $argv;
unset($a[0]);
$n = count($a);
// 找出数组中最大的数
$k = 0;
for ($i = 1; $i <= $n; $i++) {
	if ($k < $a[$i])
		$k = $a[$i];
}
// 初始化数组 $c
$c[0]= 0;
for ($i = 1; $i <= $k; $i++)
	$c[$i] = 0;

for ($i = 1; $i <= $n; $i++) {
	$c[$a[$i]]++;
}// 此时 $c[$i] 包含等于 $i 的元素个数

for ($i = 1; $i <= $k; $i++) {
	$c[$i] = $c[$i-1] + $c[$i];
}// 此时 $c[$i] 包含小于或等于 $i 的元素个数

for ($i = $n; $i >= 1; $i--) {
	$b[$c[$a[$i]]] = $a[$i];
	$c[$a[$i]]--;
}
// 输出已排好序的数组
for ($i = 1; $i <= $n; $i++)
	echo $b[$i] . ' ';
echo "\n";

 

今天又重新梳理了一遍,不能根据这个代码看出计数排序是稳定排序:

<?php
/** 
 * 计数排序
 */
$nums = [23,12,23,34,23,456,23,12,23,45,23,12,1234];

$n = count($nums);

// 找出数组中最大的数
$max = $nums[0];
for ($i = 1; $i < $n; $i++) {
        if ($max < $nums[$i]) {
                $max = $nums[$i];
        }
}

// 初始化用来计数的数组
for ($i = 0; $i <= $max; $i++) {
        $cnt[$i] = 0;
}

// 下面的 for loop 处理完毕后,$cnt[$i] 表示待排序数组中,值等于 $i 的元素个数
for ($i = 0; $i < $n; $i++) {
        $cnt[$nums[$i]]++;
}

// 下面的 for loop 处理完毕后,$cnt[$i] 表示待排序数组中,值小于等于 $i 的元素个数
for ($i = 1; $i <= $max; $i++) {
        $cnt[$i] = $cnt[$i-1] + $cnt[$i];
}

// 这一步比较难理解
for ($i = $n-1; $i >= 0; $i--) {
      $result[$cnt[$nums[$i]]] = $nums[$i];
      $cnt[$nums[$i]]--; // 前一个数找到位置后,那么和它值相同的数位置往前一步
}

for ($i = 1; $i < $n; $i++) {
        echo $result[$i], ' ';
}
echo PHP_EOL;

 

更改分区后,ubuntu进不去的解决办法

现象:我的电脑装了 windows 7 和 ubuntu 12.10 两个系统,今天新增一个分区后 ubuntu 进不去了。
解决方法:利用 easybcd 或者 grub4dos 进入 grub,手动输入命令启动 ubuntu (这里假设 boot 分区在 (hd0,6),根分区在(hd0,7))

root (hd0,6)
kernel /vmlinuz root=/dev/sda8
initrd /initrd.img
boot

进入 ubuntu 后,在终端运行 update-grub 重建 grub 配置。

共享有线连接作为无线AP

我的电脑系统是 win 7 旗舰版。
无线网卡为 Broadcom 802.11n 网络适配器。
在 cmd 里运行如下代码即可以通过无线共享本地连接。

netsh wlan set hostednetwork mode=allow ssid=YOURSSID key=YOURPASSWORD
netsh wlan start hostednetwork

YOURSSID 是无线名称 YOURPASSWORD 是无线密码,可以任意设置。

nginx php5-fpm 出现 Access denied

今天我想让 phps 后缀的文件显示其源代码。网上搜索之,按照这里的修改:

location ~ \.phps$ {
    fastcgi_pass backend;
    fastcgi_param  DOCUMENT_ROOT    $document_root;
    fastcgi_param  SCRIPT_NAME      $uri;
    fastcgi_param  SCRIPT_FILENAME  /path/to/hightlight_source.php;
}

结果访问 phps 文件出现 Access denied.

查看错误日志,发现是 security.limit_extensions 配置的问题。

修改 /etc/php5/fpm/pool.d/www.conf ,修改配置为以下即可:

security.limit_extensions = .php .phps

同理,如果你想让 php5-fpm 处理后缀文件,在该行配置下添加相应后缀名即可。
感悟:看错误日志对于排错帮助很大,找到错误之处后再在网上找相应内容一般都能解决问题。

PHP 上传文件时没有错误提示,但是 $_POST 数组却为空

这是因为 post_max_size 的值小于 upload_max_filesize 的原因引起的。

默认 post_max_size=8M ,upload_max_filesize=2M 。当我将最大上传大小改为 10M 后,我再尝试上传大于 10M 的文件就出现如题的问题。

解决方法:

在 php.ini 设置,将 post_max_size 的值设置为大于 upload_max_filesize 的值。

要执行请求的操作,WORDPRESS 需要访问您网页服务器的权限。

我自己搭建的服务器,环境是:ubuntu server 12.10, apache2.2.22, php5.4.6

默认 apache 用户是:www-data

WordPress 安装插件时提示:要执行请求的操作,WordPress 需要访问您网页服务器的权限。 请输入您的 FTP 登录凭据以继续。 如果您忘记了您的登录凭据(如用户名、密码),请联系您的网站托管商。

导致此问题的原因是:apache 用户与网站目录文件所有者(网站文件所有者默认为 root)不一样。将网站目录文件所有者改为 www-data 即可解决问题。

chown -R www-data /var/www

利用 .htaccess 配置多站点

我现在用的主机是在淘宝上买的一虚拟主机。比较便宜并且还带有独立IP。在该虚拟主机的控制面板上我添加了三个域名分别是

blog.upliu.net
upliu.net
www.upliu.net

其中 blog.upliu.net 就是你现在看到的这个博客啦。
然后将主域名 upliu.net 和 www.upliu.net 绑定到主机根目录下的一个子目录。这样就实现了一个虚拟主机搭建多个站点。
主机根目录下的 .htaccess 文件内容如下(包含了 wordpress 伪静态的配置):

# BEGIN WordPress
RewriteEngine On
# Rewrite for upliu.net and www.upliu.net
RewriteCond %{HTTP_HOST} ^(www\.)?upliu\.net [NC]
RewriteRule ^(.*)$ /siteupliu/$1 [L]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

我要绑定的目录是 siteupliu,还需要在该目录下的 .htaccess 加入如下内容:

RewriteEngine on
RewriteBase /siteupliu/