PHP排序算法类【分享】

四种排序算法的PHP实现
1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
2) 选择排序(Selection Sort)的基本思想是:
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
3) 冒泡排序的基本思想是:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。 
<?php
/**
 * 四种排序算法设计(PHP)
 *
 * 1) 插入排序(Insertion Sort)的基本思想是:
	  每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
   2) 选择排序(Selection Sort)的基本思想是:
      每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
   3) 冒泡排序的基本思想是:
      两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
   4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。
 * 
 * @author quanshuidingdang
 */
class Sort {
	private $arr 	= array();	
	private $sort	= 'insert';
	private $marker = '_sort';
	
	private $debug = TRUE;
	
	/**
	 * 构造函数
	 *
	 * @param	array	例如: $config = array (
									'arr' => array(22,3,41,18) , 	//需要排序的数组值
									'sort' => 'insert',			  	//可能值: insert, select, bubble, quick
									'debug' => TRUE	    			//可能值: TRUE, FALSE
									)
	 */
	public function __construct($config = array()) {
		if ( count($config) > 0) {
			$this->_init($config);
		}
	}
	
	/**
	 * 获取排序结果
	 */
	public function display() {
		return $this->arr;
	}
	
	/**
	 * 初始化
	 *
	 * @param	array
	 * @return 	bool
	 */
	private function _init($config = array()) {
		//参数判断
		if ( !is_array($config) OR count($config) == 0) {
			if ($this->debug === TRUE) {
				$this->_log("sort_init_param_invaild");
			}
			return FALSE;
		}
		
		//初始化成员变量
		foreach ($config as $key => $val) {
			if ( isset($this->$key)) {
				$this->$key = $val;
			}
		}
		
		//调用相应的成员方法完成排序
		$method = $this->sort . $this->marker;
		if ( ! method_exists($this, $method)) {
			if ($this->debug === TRUE) {
				$this->_log("sort_method_invaild");
			}
			return FALSE;
		}
		
		if ( FALSE === ($this->arr = $this->$method($this->arr)))
			return FALSE;
		return TRUE;
	}
	
	/**
	 * 插入排序
	 * 
	 * @param	array
	 * @return	bool
	 */
	private function insert_sort($arr) {
		//参数判断
		if ( ! is_array($arr) OR count($arr) == 0) {
			if ($this->debug === TRUE) {
				$this->_log("sort_array(insert)_invaild");
			}
			return FALSE;
		}
		
		//具体实现
		$count = count($arr);
		for ($i = 1; $i < $count; $i++) {
			$tmp = $arr[$i];//获取后一个元素的值
			for($j = $i-1; $j >= 0; $j--) {	
				if($arr[$j] > $tmp) {//如果前面一个比后面一个大, 这里是从小到大
					$arr[$j+1] = $arr[$j];//把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 
					$arr[$j] = $tmp;
				}
			}
		}
		return $arr;
	}
	
	/**
	 * 选择排序
	 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 
	 * @param	array
	 * @return	bool
	 */
	private function select_sort($arr) {
		//参数判断
		if ( ! is_array($arr) OR count($arr) == 0) {
			if ($this->debug === TRUE) {
				$this->_log("sort_array(select)_invaild");
			}
			return FALSE;
		}
		
		//具体实现
		$count = count($arr);
		for ($i = 0; $i < $count-1; $i++) {
			$min = $i;//找出最小的 
			for ($j = $i+1; $j < $count; $j++) {
				if ($arr[$min] > $arr[$j])  $min = $j;
			}
			if ($min != $i) {
				$tmp = $arr[$min];
				$arr[$min] = $arr[$i];
				$arr[$i] = $tmp;
			}
		}
		return $arr;
	}
	
	/**
	 * 冒泡排序
	 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 
	 * @param	array
	 * @return	bool
	 */
	private function bubble_sort($arr) {
		//参数判断
		if ( ! is_array($arr) OR count($arr) == 0) {
			if ($this->debug === TRUE) {
				$this->_log("sort_array(bubble)_invaild");
			}
			return FALSE;
		}
		
		//具体实现
		$count = count($arr);
		for ($i = 0; $i < $count; $i++) {
			for ($j = $count-1; $j > $i; $j--) {
				if ($arr[$j] < $arr[$j-1]) {/比较找到的数进行交换 
					$tmp = $arr[$j];
					$arr[$j] = $arr[$j-1];
					$arr[$j-1] = $tmp;
				}
			}
		}
		return $arr;	
	}
	
	/**
	 * 快速排序
	 * 
	 * @param	array
	 * @return	bool
	 */
	private function quick_sort($arr) {
		//具体实现
		if (count($arr) <= 1) return $arr; 
		$key = $arr[0];
		$left_arr = array();
		$right_arr = array();
		for ($i = 1; $i < count($arr); $i++){
			if ($arr[$i] <= $key)
				$left_arr[] = $arr[$i];
			else
				$right_arr[] = $arr[$i];
		}
		$left_arr = $this->quick_sort($left_arr);
		$right_arr = $this->quick_sort($right_arr); 

		return array_merge($left_arr, array($key), $right_arr);
	}
	
/**
  * 按照元素的值进行排序
  * strOrder 为排列的顺序 asc 升序  desc 降序
  */
function sortByVal($arr,$strOrder='asc')
{
	if(!is_array($arr) || count($arr)==0)
	{
		return $arr;
	}

	$arrReturn = array();
	foreach($arr as $key=>$val)
	{
		$arrKey[] = $key;
		$arrVal[] = $val;
	}

	$count = count($arrVal);
	if($count)
	{
		//创建key的顺序数组
		for($key=0;$key<$count;$key++)
		{
			$arrKeyMap[$key] = $key;  
		}
		//对值进行排序
		for($i=0;$i<$count;$i++)
		{	
			
			for($j = $count-1; $j>$i;$j--)
			{
				//<从小到大排列 升降在这修改
				$bol = $strOrder == 'asc' ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1];
				if($bol){
					$tmp = $arrVal[$j];
					$arrVal[$j] = $arrVal[$j-1];
					$arrVal[$j-1] = $tmp;
					//值的冒泡排序,引起key的数组的交互	
					$keytmp = $arrKeyMap[$j];
					$arrKeyMap[$j] = $arrKeyMap[$j-1];
					$arrKeyMap[$j-1] = $keytmp;
				}
			}
		}
		if(count($arrKeyMap))
		{
			foreach ($arrKeyMap as $val)
			{
					$arrReturn[] = $arrKey[$val];
			}
		}
		return $arrReturn;
	}
}
/** * 日志记录 */private function _log($msg) {$msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n';return @file_put_contents('sort_err.log', $msg, FILE_APPEND);}}/*End of file sort.php*//*Location htdocs/sort.php */


<?php

require_once('sort.php');

$config = array (
			'arr' => array(23, 22, 41, 18, 20, 12, 200303,2200,1192) , 	//需要排序的数组值
			'sort' => 'select',			  				//可能值: insert, select, bubble, quick
			'debug' => TRUE	    						//可能值: TRUE, FALSE
		);

$sort = new Sort($config);
//var_dump($config['arr']);
var_dump($sort->display());
		
/*End of php*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值