PHP冒泡排序实现

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>";
	}	
}



你可能感兴趣的:(php算法)