php练习二
数组常用的排序法有:冒泡排序法、选择排序法、插入排序法、(快速排序法)。
1、冒泡排序法(交换式排序法):其基本思想是通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部,就像水底下的汽泡一样逐渐向上冒。
举例说明:
<?php $arr=array(0,-1,3,-5,2,10,5); //按升序排序即从小到大排序 $count=count($arr); $temp=0; for($i=0;$i<$count-1;$i++){ for($j=0;$j<$count-1-$i;$j++){ //如果前面的数比后面的大,则进行交换 if($arr[$j]>$arr[$j+1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; } } } print_r ($arr); ?>
打印输出:Array ( [0] => -5 [1] => -1 [2] => 0 [3] => 2 [4] => 3 [5] => 5 [6] => 10 )
若将上面的排序封装成一个函数,则代码如下:
<?php function bubbleSort(&$arr){ $count=count($arr); $temp=0; for($i=0;$i<$count-1;$i++){ for($j=0;$j<$count-1-$i;$j++){ //如果前面的数比后面的大,则进行交换 if($arr[$j]>$arr[$j+1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; } } } } $arr=array(0,-1,3,-5,2,10,5); bubbleSort($arr); print_r($arr); ?>
注意:需要在函数中的参数前面添加“&”符,参数以引用(地址)传递,这样才能改变$arr的值,否则最后打印输出的还是原来的数组(即未经过排序)。
2、选择排序法
选择排序属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
举例说明:
<?php /*选择排序*/ function selectSort(&$arr){ $temp=0; for($i=0;$i<count($arr)-1;$i++){ $minVal=$arr[$i]; $minIndex=$i; for($j=$i+1;$j<count($arr);$j++){ if($minVal>$arr[$j]){ $minVal=$arr[$j]; $minIndex=$j; } } $temp=$arr[$i]; $arr[$i]=$arr[$minIndex]; $arr[$minIndex]=$temp; } } $arr=array(2,0,-1,1); selectSort($arr); print_r ($arr); ?>
3、插入排序法
其基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把他的排序码依次与有序表元素的排序码进行对比,将它插入到有序表中的适当位置,使之成为新的有序表。
举例说明:
<?php //插入排序(升序) function insertSort(&$arr){ //先默认下标为0,这个数已经是有序的 for($i=1;$i<count($arr);$i++){ //$insertVal是准备插入的数 $insertVal=$arr[$i]; //准备先与$insertIndex进行比较 $insertIndex=$i-1; //如果满足这个条件,说明还没有找到适当的位置 while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){ $insertIndex--; } //插入(这时就给$insertVal找到适当的位置) $arr[$insertIndex+1]=$insertVal; } } $arr=array(2,0,-1,1); insertSort($arr); print_r ($arr); ?>