<?php
/**
*
* Enter description here ...
* @author 秀才
* E-Mail:xiuwu_just@163.com
* DATE:2012-3-3
* 冒泡排序算法1:假设有数组$a = array(2,1,4,3,6,9,8,7),我们用($a[0],$a[1])作比较后发现$a[0]>$a[1],然后两数交换
* 此时数组为(1,2,4,3,6,9,8,7),第一次比较发现最大数为2,即现在的$a[1],接着用$a[1]和$a[2]比较,发现$a[2]>$a[1],
* (如果最大数小于下一个数就交换否则不交换)此时数组为(1,2,4,3,6,9,8,7),再用目前的最大数$a[2]和$a[3]比较
* 依次类推...第一轮循环过后,那么数组中最后
* 一个数便是最大数,然后在进行第二轮的循环,直到最后一轮,循环的次数为数组的长度-1,共分为内外两层循环
* 冒泡排序算法2:假设有数组$a = array(2,1,4,3,6,9,8,7),我们用($a[0],$a[1])作比较后发现$a[0]>$a[1],然后两数交换
*此时数组为(2,1,4,3,6,9,8,7),再用$a[2]和$a[0]作比较$a[2]>$a[0](如果最大数小于下一个数就交换否则不交换),此时数组为(4,1,2,3,6,9,8,7),
*以此类推...也分为内外两层循环(冒泡排序2的算法实现让给喜欢思考的读者去实现吧)
*冒泡排序1和冒泡排序2的区别在于:排序1是相邻两个数作比较如果不等则互换,而排序2是除第一个数外(外层循环的第一个数),其他的数
*都和第一个数作比较如果不等则互换.
*
*选择排序和冒泡算法1是同理的,区别在于,选择排序每次比较不做两个数的互换,只记录最大(最小)值,然后在内层外循环结束后用最大(最小)
*值和外层循环的第一个数交换
*/
class sort
{
private $arr;
function __construct($arr = array())
{
$this->arr = $arr;
}
//冒泡排序
function sort_bubbling($order = 0)
{
$order = is_int($order) ? $order : intval($order);
$order = $order > 0 ? 1 : 0;
$len = count($this->arr) - 1;
//从小到大排序
if($order)
{
$star = time();
for ($i = 0; $i < $len; $i++)
{
for ($j = 0; $j < ($len - $i); $j++)
{
if($this->arr[$j] > $this->arr[$j+1])
{
//记录最大值的临时变量
$tmp = $this->arr[$j];
$this->arr[$j] = $this->arr[$j+1];
$this->arr[$j+1] = $tmp;
}
}
}
}
//从大到小排序
else
{
for ($i = 0; $i < $len; $i++)
{
for ($j = 0; $j < ($len - $i); $j++)
{
if($this->arr[$j] < $this->arr[$j+1])
{
//记录最小值的临时变量
$tmp = $this->arr[$j+1];
$this->arr[$j+1] = $this->arr[$j];
$this->arr[$j] = $tmp;
}
}
}
}
print_r($this->arr);
}
//选择排序
function sort_select($order = 0)
{
$len = count($this->arr) - 1;
$tmplen = $len;
$order = is_int($order) ? $order : intval($order);
$order = $order > 0 ? 1 : 0;
//从大到小排序
if($order)
{
for ($i = 0; $i <= $len; $i++)
{
//记录最大数的下标(初始化为数组的第一个下标)
$flag = $i;
for ($j = $i + 1; $j <= $len; $j++)
{
if($this->arr[$j] > $this->arr[$flag])
{
$flag = $j;
}
}
//下标发生变化说明产生了最大值,两个数值进行交换
if ($flag != $i)
{
$tmp = $this->arr[$flag];
$this->arr[$flag] = $this->arr[$i];
$this->arr[$i] = $tmp;
}
}
}
//从小到大排序
else
{
for ($i = 0; $i < $len; $i++)
{
//记录最小数的下标(初始化为数组的第一个下标)
$flag = $i;
for ($j = $i + 1; $j <= $len; $j++)
{
if($this->arr[$j] < $this->arr[$flag])
{
$flag = $j;
}
}
//下标发生变化说明产生了最小值,两个数值进行交换
if($flag != $i)
{
//临时变量
$tmp = $this->arr[$flag];
$this->arr[$flag] = $this->arr[$i];
$this->arr[$i] = $tmp;
}
}
}
print_r($this->arr);
}
}
/**
*
* Enter description here ...
* @author 秀才
* E-Mail:xiuwu_just@163.com
* DATE:2012-3-3
* 冒泡排序算法1:假设有数组$a = array(2,1,4,3,6,9,8,7),我们用($a[0],$a[1])作比较后发现$a[0]>$a[1],然后两数交换
* 此时数组为(1,2,4,3,6,9,8,7),第一次比较发现最大数为2,即现在的$a[1],接着用$a[1]和$a[2]比较,发现$a[2]>$a[1],
* (如果最大数小于下一个数就交换否则不交换)此时数组为(1,2,4,3,6,9,8,7),再用目前的最大数$a[2]和$a[3]比较
* 依次类推...第一轮循环过后,那么数组中最后
* 一个数便是最大数,然后在进行第二轮的循环,直到最后一轮,循环的次数为数组的长度-1,共分为内外两层循环
* 冒泡排序算法2:假设有数组$a = array(2,1,4,3,6,9,8,7),我们用($a[0],$a[1])作比较后发现$a[0]>$a[1],然后两数交换
*此时数组为(2,1,4,3,6,9,8,7),再用$a[2]和$a[0]作比较$a[2]>$a[0](如果最大数小于下一个数就交换否则不交换),此时数组为(4,1,2,3,6,9,8,7),
*以此类推...也分为内外两层循环(冒泡排序2的算法实现让给喜欢思考的读者去实现吧)
*冒泡排序1和冒泡排序2的区别在于:排序1是相邻两个数作比较如果不等则互换,而排序2是除第一个数外(外层循环的第一个数),其他的数
*都和第一个数作比较如果不等则互换.
*
*选择排序和冒泡算法1是同理的,区别在于,选择排序每次比较不做两个数的互换,只记录最大(最小)值,然后在内层外循环结束后用最大(最小)
*值和外层循环的第一个数交换
*/
class sort
{
private $arr;
function __construct($arr = array())
{
$this->arr = $arr;
}
//冒泡排序
function sort_bubbling($order = 0)
{
$order = is_int($order) ? $order : intval($order);
$order = $order > 0 ? 1 : 0;
$len = count($this->arr) - 1;
//从小到大排序
if($order)
{
$star = time();
for ($i = 0; $i < $len; $i++)
{
for ($j = 0; $j < ($len - $i); $j++)
{
if($this->arr[$j] > $this->arr[$j+1])
{
//记录最大值的临时变量
$tmp = $this->arr[$j];
$this->arr[$j] = $this->arr[$j+1];
$this->arr[$j+1] = $tmp;
}
}
}
}
//从大到小排序
else
{
for ($i = 0; $i < $len; $i++)
{
for ($j = 0; $j < ($len - $i); $j++)
{
if($this->arr[$j] < $this->arr[$j+1])
{
//记录最小值的临时变量
$tmp = $this->arr[$j+1];
$this->arr[$j+1] = $this->arr[$j];
$this->arr[$j] = $tmp;
}
}
}
}
print_r($this->arr);
}
//选择排序
function sort_select($order = 0)
{
$len = count($this->arr) - 1;
$tmplen = $len;
$order = is_int($order) ? $order : intval($order);
$order = $order > 0 ? 1 : 0;
//从大到小排序
if($order)
{
for ($i = 0; $i <= $len; $i++)
{
//记录最大数的下标(初始化为数组的第一个下标)
$flag = $i;
for ($j = $i + 1; $j <= $len; $j++)
{
if($this->arr[$j] > $this->arr[$flag])
{
$flag = $j;
}
}
//下标发生变化说明产生了最大值,两个数值进行交换
if ($flag != $i)
{
$tmp = $this->arr[$flag];
$this->arr[$flag] = $this->arr[$i];
$this->arr[$i] = $tmp;
}
}
}
//从小到大排序
else
{
for ($i = 0; $i < $len; $i++)
{
//记录最小数的下标(初始化为数组的第一个下标)
$flag = $i;
for ($j = $i + 1; $j <= $len; $j++)
{
if($this->arr[$j] < $this->arr[$flag])
{
$flag = $j;
}
}
//下标发生变化说明产生了最小值,两个数值进行交换
if($flag != $i)
{
//临时变量
$tmp = $this->arr[$flag];
$this->arr[$flag] = $this->arr[$i];
$this->arr[$i] = $tmp;
}
}
}
print_r($this->arr);
}
}
?>
下面是测试用的:
<?php
include 'sort.php';
$arr = array(2,1,4,3,6,9,8,7);
$sort = new sort($arr);
$sort -> sort_bubbling(8);
//$sort -> sort_select();
include 'sort.php';
$arr = array(2,1,4,3,6,9,8,7);
$sort = new sort($arr);
$sort -> sort_bubbling(8);
//$sort -> sort_select();