php冒泡和选择排序

<?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);
 }
}
?>
下面是测试用的:
<?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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值