PHP 排序方法 (持續更新)

<?php

	class sortFunction{

		/**
		 * [bubbleSort 冒泡排序(我這個是從頭到尾,不是從尾到頭。排的順序不同]
		 * @param  [array] $arr [description]
		 * @return [array] $arr [description]
		 * 依次比较相邻的两个数,将小数放在前面,大数放在后面
		 * -----解釋來自百度
		 */
		function bubbleSort($arr){

			$iCount      = count($arr);			//  數組元素個數。
			if($iCount<2){
				return $arr;
			}  for($i=0;$i<$iCount;$i++){		//  $j是控制該元素交換位置次數。
				for($j=$iCount-1;$j>$i;$j--){			//  冒泡過程    
					if($arr[$j]<$arr[$j-1]){
						$aTemp     = $arr[$j];
						$arr[$j] = $arr[$j-1];
						$arr[$j-1]   = $aTemp;
					}
				}
			}
                     return $arr;
		}

		/**
		 * [quickSort 快速排序]
		 * @param  [array] $arr [description]
		 * @return [array] $arr [description]
		 *
		 * 通过一趟排序将要排序的数据分割成独立的两部分,
		 * 其中一部分的所有数据都比另外一部分的所有数据都要小,
		 * 然后再按此方法对这两部分数据分别进行快速排序.
		 * -----解釋來自百度
		 */
		function quickSort($arr){

			$iCount      = count($arr);			//  數組元素個數。
			if($iCount<2){
				return $arr;
			}
			$key      = $arr[0];				//  隨便一個元素值作為key值。
			$arrLeft  = array();				//  所有比$key小的元素放在$arrLeft中
			$arrRight = array();				//  所以比$key大的元素放在$arrRight中
			for($i=1;$i<$iCount;$i++){			//  遍歷數組元素 .注意這裡是從1開始
				if($arr[$i]<=$key){				//  元素與$key比較
					$arrLeft[]  = $arr[$i];
				}else{
					$arrRight[] = $arr[$i];
				}
			}

			$arrLeft     = $this->quickSort($arrLeft);						// 得到的$arrLeft在進行快速排序
			$arrRight    = $this->quickSort($arrRight);   					//得到的$arrRight在進行快速排序
			$arr         = array_merge($arrLeft,array($key),$arrRight);     //將$arrLeft,$key,$arrRight合併,得到最終排序數組。
			return $arr;
		}

		/**
		 * [insertSort 插入排序]
		 * @param  [int]   $var [待排序數值]
		 * @param  [array] $arr [已排序數組]
		 * @return [type]       [description]
		 * 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,
		 * 从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序
		 */
		function insertSort($var,$arr){

			$iCount   = count($arr);
			$arrLeft  = array();
			$arrRight = array();
			if($arr[0]>$var){								//$var小於最小數時。插入數組頭部。
					array_unshift($arr,$var);			
					return $arr;	
			}
			if($arr[$iCount-1]<$var){						//$var大於最大數時。插入數組尾部。
					array_push($arr,$var);
					return $arr;
			}
			for($i=0;$i<$iCount;$i++){
				if($arr[$i]<=$var & $arr[$i+1]>$var){
					$arrLeft = array_slice($arr,0,$i+1);	
					array_push($arrLeft,$var);				//把$var,放入$arrLeft尾部。
					$arrRight =array_slice($arr,$i+1);
				}
			}

			$arr = array_merge($arrLeft,$arrRight);			
			return $arr;
		}
		
		/**
		 * [dichotomySort 二分法查找數組的元素位置]
		 * @param  [type] $var   [要找的元素]
		 * @param  [type] $arr   [已排序好的數組]
		 * @param  [type] $start [每次查找的開始位置]
		 * @param  [type] $end   [每次查找的結束位置]
		 * @return [type] $mid   [元素在數組的位置]
		 */
		function dichotomySort($var,$arr,$start,$end){
			if(empty($start) & empty($end)){		//判斷是否是第一次排序。
				$start = 0 ;
				$end   = count($arr)-1;
			}
			if($start<=$end){
				$mid = intval(($end+$start)/2);		//從中間開始比較
				if($arr[$mid]==$var){				//如果$var與$arr[$mid]相等,則返回$mid.
					return $mid;					
				}elseif($var<$arr[$mid]){
					return $this->dichotomySort($var,$arr,$start,$mid-1);	//$var比$arr[$mid]小,遞歸該方法。結束位置變成$mid-1;
				}else{
					return $this->dichotomySort($var,$arr,$mid+1,$end);		//$var比$arr[$mid]大,遞歸該方法。開始位置變成$mid+1;
				}
			}else{
				return "Your number is not in the array";					//如果數組里沒有該元素,則返回該語句。

			}

		}

	}


	$arr         = array(40,13,22,23,37,100,59,37,89,20,9);
	$oTest       = new sortFunction();
	$aResult     = $oTest->bubbleSort($arr);
	$aInserResult = $oTest->dichotomySort(40,$aResult);
	print_r($aInserResult);

?>

你可能感兴趣的:(PHP,排序方法)