文档章节

PHP冒泡排序实现

justphp
 justphp
发布于 2013/12/26 09:54
字数 507
阅读 22
收藏 0
class BubbleSort {
	/**
	 * 冒泡排序。
	 *
	 * @var integer
	 */
	const SORT_NORMAL = 1;

	/**
	 * 双向冒泡排序。
	 *
	 * @var integer
	 */
	const SORT_DUPLEX = 2;

	/**
	 * 需要排序的数据数组。
	 *
	 * @var array
	 */
	private $data;

	/**
	 * 数据数组的长度。
	 *
	 * @var integer
	 */
	private $size;

	/**
	 * 数据数组是否已排序。
	 *
	 * @var boolean
	 */
	private $done;

	/**
	 * 构造方法 - 初始化数据。
	 *
	 * @param array $data 需要排序的数据数组。
	 */
	public function __construct(array $data) {
		$this->data = $data;
		$this->size = count($this->data);
		$this->done = FALSE;
	}

	/**
	 * 交换数据数组中两个元素的位置。
	 *
	 * @param integer $x 元素在数组中的索引。
	 * @param integer $y 元素在数组中的索引。
	 */
	private function swap($x, $y) {
		$temp = $this->data[$x];
		$this->data[$x] = $this->data[$y];
		$this->data[$y] = $temp;
	}

	/**
	 * 冒泡排序。
	 */
	private function sort() {
		$this->done = TRUE;

		for ($i = 1; $i < $this->size; ++$i) {
			// 记录交换数据的次数。
			$swap = 0;

			for ($j = $this->size - 1; $j > $i - 1; --$j) {
				if ($this->data[$j] < $this->data[$j - 1]) {
					$this->swap($j - 1, $j);
					++$swap;
				}
			}

			// 若交换数据的次数为0,说明数据数组已有序,不必再进行排序。
			if (0 === $swap) {
				break ;
			}
		}
	}

	/**
	 * 双向冒泡排序。
	 */
	private function duplexSort() {
		$this->done = TRUE;

		for ($i = 1; $i <= floor($this->size / 2); ++$i) {
			// 记录交换数据的次数。
			$swap = 0;

			for ($j = $this->size - 1, $k = $i - 1;$j > $i - 1 && $k < $this->size - 1; --$j, ++$k) {
				if ($this->data[$j] < $this->data[$j - 1]) {
					$this->swap($j - 1, $j);
					++$swap;
				}

				if ($this->data[$k] > $this->data[$k + 1]) {
					$this->swap($k, $k + 1);
					++$swap;
				}
			}

			// 若交换数据的次数为0,说明数据数组已有序,不必再进行排序。
			if (0 === $swap) {
				break;
			}
		}
	}

	/**
	 * 获取排序后的数据数组。
	 *
	 * @param integer $sort 排序算法:SORT_NORMAL为冒泡排序;SORT_DUPLEX为双向冒泡排序。
	 * @return array 返回排序后的数据数组。
	 */
	public function getResult($sort = self::SORT_NORMAL) {
		// 若已排序则无需再进行排序,直接返回排序好的数据数组。
		if ($this->done) {
			return $this->data;
		}

		switch ($sort) {
			case self::SORT_DUPLEX:
				$this->duplexSort();
				break;

			case self::SORT_NORMAL:
			default:
				$this->sort();
				break;
		}

		return $this->data;
	}
}



//附带另类实现
function BuddleSort($arr)
{
	$arrLength = count($arr);
	for ($i=0;$i<$arrLength;$i++)
	{
		for ($j=0;$j<$arrLength-i && isset($arr[$j+1]);$j++)
		{
			if($arr[$j] > $arr[$j+1]){
				$tmp = $arr[$j+1];
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $tmp;
			}
		}
		echo "第".($i+1)."趟:";print_r($arr);echo "</br>";
	}	
}



© 著作权归作者所有

justphp
粉丝 7
博文 13
码字总数 6324
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

月影又无痕
月影又无痕
查阅手册sort
PHPer面试指南-算法篇

本书的 GitHub 地址:https://github.com/todayqq/PHPerInterviewGuide 算法可以说是大厂的必考题,对于算法,一定要理解其中的精髓、原理。 冒泡排序 冒泡排序的原理:一组数据,比较相邻数...

angkee
2018/01/24
0
0
PHP实现排序算法

一、冒泡排序 大O符号:order,译为阶,也可以理解为数量级。 冒泡排序原理步骤 每一轮排序找到最大的值,放在数组的最后,并且,排好序的数不再参与下一轮的排序; 每一轮的排序规则是:每次...

上古遗露
2016/02/24
80
0
php冒泡排序跟二分算法

PHP冒泡排序 $i=1,子循环运行$j=5,$j=4,$j=3,$j=2,$=1;第一次查找将这个数组中最小的放到第一位去 $=2,资讯还运行$j=5,$j=4;$j=3;$j=2;第二次查找这个数组中次小的放到第二去 如此循环就实现...

tree2013
2016/04/18
39
0
php四种基础算法:冒泡,选择,插入和快速排序法

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算...

PHP86
2013/12/21
0
0
Python vs PHP 冒泡排序和累加求和计算性能测试

测试环境: 处理器i5-3230M,64位Ubuntu 14.04 Python 2.7.6, PHP 5.4.39, PHP 7.0.0-dev(2015/04/21) 测试内容: 冒泡排序:对10个升序的数进行排序,降序输出,循环1百万次. 累加求和:0+1+2+3+.....

eechen
2015/04/25
0
18

没有更多内容

加载失败,请刷新页面

加载更多

3分钟看懂Activity启动流程

背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理。为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码。当遇到棘手的问题时,你才能更快速的结合系统...

天王盖地虎626
38分钟前
1
0
机器学习算法GPU版本安装配置

##XGBoost for GPU安装https://blog.csdn.net/weixin_30963287/article/details/79145107https://blog.csdn.net/wl2858623940/article/details/80546140https://blog.csdn.net/u01164186......

KYO4321
40分钟前
1
0
微软展开训练AI来推Windows 10 1903版自动更新

Windows 10 May 2019(1903版)正式释出将近一个月,或许已经有用户自主安装更新了,不过微软认为还不够多。微软表示将开始训练机器学习(machine learning)技术,帮助1803版本以前的PC更新...

yisy5566
今天
0
0
前后端分离-前端搭建(Vue)(2)

先安装node.js以及npm 现在基本的node.js都包含有npm,下载安装后, 可以在cmd命令里输入 node -v 和npm -v 分别查看安装的版本 两个都显示了版本就是安装ok 这次我们使用JetBrains WebStor...

咸鱼-李y
今天
0
0
好程序员web前端教程分享三大前端框架相关问题

  好程序员web前端教程分享三大前端框架相关问题,三大前端框架,有没有哪个框架的组件间交互像js的方法传值一样简单? 首先框架组件通信是为了方便组件模块之间进行数据交互的,因为框架的...

好程序员IT
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部