Web_PHP_数组排序、查找算法;

一、数组排序
1、排序分类
(1)、内部排序
 指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
(2)、外部排序
 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法);


 2、交换式排序法
 交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
(1)、冒泡排序法(Bubble sort);[重要讲解]
(2)、快速排序法 (Quick sort);[重要讲解]


3、选择式排序法
 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
(1)、选择排序法(Selection Sort);[重要讲解]
(2)、堆排序法(Heap Sort);


4、插入式排序法_ppt-29
 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
 (1)、插入排序法(InsertionSort);[重要讲解]
 (2)、谢耳排序法(shell sort);
 (3)、二叉树排序法(Binary-tree sort);


5、冒泡排序法(Bubble sort)、快速排序法 (Quick sort)、选择排序法(Selection Sort)、插入排序法(InsertionSort) 举例说明
(1)、冒泡排序法(BubbleSort)
=举例> $array = [23,56,11,36,88];
=规则> 从小到大
=0>[23,56,11,36,88]
23,56 [23,56,11,36,88] 
56,11 [23,11,56,36,88] 
56,36 [23,11,36,56,88] 
56,88 [23,11,36,56,88] 
=1>[23,11,36,56]
23,11[11,23,36,56]
23,36[11,23,36,56]
36,56[11,23,36,56]
=2>[11,23,36]
11,23[11,23,36]
23,36[11,23,36]
=3>[11,23]
11,23[11,23]
// 冒泡排序函数
function mpSort(&$arr) {
	$temp;	// 临时变量: 用于两数组元素互相换值;
	$flag = false;	// 标识变量,标识数组是否已经排序好;
	/*
	* $i<count(array)-1: 假设数组元素个数为5,那意味着,只要排好4个,那最后一个自然会处于合适的位置,所以外层循环count(array)-1次;
	*/
	// 外层循环
	for($i=0; $i<count(array)-1; $i++){
		// 内层循环
		/*
		* $j<(count(array)-1)-$i: 为什么减去$i呢?因为$i表示已经排好的元素的个数;
		*/
		for($j=0; $j<(count(array)-1)-$i; $j++){
			// 如果 前面元素 比 后面元素 大,则发生交换,这样,就能保证最大的元素在最右边;如果从大到小排序,则使最小的元素在最右边;
			if($array[$j] > $array[$j+1]) {
				$temp = $array[$j];
				$array[$j] = $array[$j+1];
				$array[$j+1] = $temp;
				$flag = true;
			}
		}


		if(!$flag){
			// 不为真,则表明,没有排过序,那说明数组已经排好序;
			break;
		}
		$flag = false;
	}
}




(2)、快速排序法_ppt-33
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(1)、举例说明
传说: 快速排序法,就是一分二,二分四,四分八的过程。
<?php
	// 时间设置: 采用比较时间前后差值,来比较性能;
	date_default_timezone_set('Asia/Shanghai');
	$today = date('Y-n-d G:i:s');
	echo $today;
	
	// 数组
	$array=array(-9, 78, 0, 23, -567, 89);	// 共6个元素;
	function quickSort($left, $right, &$array){
			$l=$left;		// 左边下标;0
			$r=$right;	// 右边下标;5


			// 中间元素;
			$pivot = $array[($left+$right)/2];	// 23;
			// 临时变量
			$temp=0;
			
			while($l<$r){
				while($array[$l]<$pivot) $l++;	//1、l =1 78;2、l=3  23;
				while($array[$r]>$pivot) $r--;		//1、 r =4 -567; 2、r =3 23;
				
				if($l>=$r) break;
				
				// 交换值,从而保证左边元素小于中间值,右边大于中间值;结果:(-9, -567, 0, 23, 78, 89)
				$temp=$array[$l];
				$array[$l]=$array[$r];
				$array[$r]=$temp;
				
				if($array[$l]==$pivot) --$r;
				if($array[$r]==$pivot) ++$l;
				
							
			}
			


			if($l==$r){
				 
				 $l++;	// l =4;
				 $r--;		// r = 3;
			}
			
			if($left<$r)  quickSort($left,$r,$array);
			if($right>$l) quickSort($l,$right,$array);
						
	}
	// 调用函数 进行排序
	quickSort(0,count($array)-1,$array);
	print_r($array);
?>




(3)、选择排序法(SelectionSort)
 基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,…,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…, 第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
/// 举例说明
<?php
	// 待排序数组
	$arr = array(34,9,90,2,3,1,-12);
	echo "排序前<br/>";
	print_r($arr);


	//选择排序法【特别说明,数组传递是值传递,不是地址传递(不是引用传递)!!!】
	//如果要影响到函数外边的$arr,则需要 function selectSort(&$arr) 才可以,记得在参数前加&符号;
	//调用时候,是 selectSort($arr)即可,即和普通的调用方法没有什么不一样;
	function selectSort($arr){
		echo "<br/>select sort 被调用<br/>";
		
		// 临时变量
		$temp;


		/// 外层循环: 有n个元素,排好n-1个,那最后一个自然排好;
		for($i=0;$i<count($arr)-1;$i++){
			//假设当前$i对应的值是最小的;就是拿出每次大循环最前的元素,假设为最小值;
			$min=$arr[$i];		// 最小值;
			$minIndex=$i;		// 下标值;
			
			/// 内层循环: 查找最小值;从大循环第二个元素开始比较,如果发现比假设值小,则记住;
			for($j=$i+1; $j<count($arr); $j++){
				if($min>$arr[$j]){
					//说明我们假设的最小值,不是最小值,所以记住当前值;
					$min=$arr[$j];
					//同时修改$minIndex
					$minIndex=$j;
				}
			}


			/// 交换值: 每次大循环结束,都会产生一个最小值;
			//这时该轮的最小值和下标找到了,可以交换;
			if($minIndex!=$i){		//如果相等,则无需交换;
				$temp=$arr[$i];
				$arr[$i]=$arr[$minIndex];
				$arr[$minIndex]=$temp;
			}


		}


		echo "<br/>在selectsort函数内排序后<br/>";
		print_r($arr);	//这里打印出排序后的顺序;
	}


	//测试
	selectSort($arr);
	echo "<br/>排序后<br/>";
	print_r($arr);
?>




(4)、插入排序法
 基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
(1)、举例说明
<?php
	// 待排序数组:从小到大;
	$arr = array(34,9,90,2,3,1,-12);


	echo "排序前<br/>";
	print_r($arr);
	
	// 引用传递
	function insertSort(&$arr){
		/// 从第二个开始比较
		for($i=1;$i<count($arr);$i++){
			// 插入值(比较值)
			$insertVal=$arr[$i];
			// 前一个下标,也是内层循环控制变量;
			$index=$i-1;
			while($index>=0&&$arr[$index]>$insertVal){
				// 后一个等于前一个
				$arr[$index+1]=$arr[$index];
				$index--;
			}
			// 前一个等于插入值;
			$arr[$index+1]=$insertVal;
		}
	}


	insertSort($arr);
	echo "<br/>排序后<br/>";
	print_r($arr);
?>




二、数组查找
1、查找分类
(1)、顺序查找;
(2)、二分查找;
<?php
	//二分查找: 前提是,数组是有序的;
	$arr=array(56,90,123,234);
	function binarySearch($l,$r,$arr,$findVal){
		// 中间元素下标
		$midIndex=round(($l+$r)/2);


		if($l>$r){
			echo "找不到";
			return ;
		}


		if($arr[$midIndex]>$findVal){
			binarySearch($l,$midIndex-1,$arr,$findVal);
		}else if($arr[$midIndex]<$findVal){
			binarySearch($midIndex+1,$r,$arr,$findVal);
		}else{
			echo "找到了,下标为".$midIndex;
		}
	}


	binarySearch(0,count($arr)-1,$arr,2342);
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值