PHP数组排序
【内部排序法】n=count($arr)
一、交换排序法
1.冒泡排序法
<?php //冒泡排序法(升序) $arr = array(55,20,10,8,2,0); function bubblesort(&$arr) { //外循环控制排序趟数,n个数排n-1趟(第二个数排序好后,第一个数不需要再次重复循环排序) for($i=0;$i<count($arr)-1;$i++) { // 每个元素依次比较,每每两元素比较大小,即循环n-1次;后面已排序好的数不进行下次的循环排序,即n-$i-1 for($j=0; $j<count($arr)-$i-1; $j++) { if($arr[$j]>$arr[$j+1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; } // echo ($arr[$j])." "; } // print_r($arr); // echo '<br />'; } } bubbleSort($arr); print_r($arr); ?>
算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。
算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。
2.快速排序法
<?php //快速排序法 $arr = array(10,5,2,9,23,22,7,6,11,8); function quickSort($arr) { //如果不是数组或数组是空的,返回空数组 if(!is_array($arr) || empty($arr)) { return array(); } //数组长度<=1时返回数组 if(count($arr)<=1) { return $arr; } //将第一个数设为树的顶点,即中间点 $middle[0] = $arr[0]; //在其中间点左右分别开左右数组 $left = array(); $right = array(); //从第二个数开始做n-1趟循环 for($i=1; $i<count($arr); $i++) { //如果从第一个数开始的数<=中间点 if($arr[$i]<=$middle[0]) { //则将无序数赋给左边数组 $left[]=$arr[$i]; //否则赋给右边数组 } else { $right[]=$arr[$i]; } } /* echo 'L:'; print_r($left); echo '<br />M:'; print_r($middle); echo '<br />R:'; print_r($right); echo '<br />';*/ //上面的判断完成一趟遍历比较赋值后,递归,并继续赋给左右数组 $left = quickSort($left); $right = quickSort($right); //然后将左中右的数连结合并成一个数组,并返回 return array_merge($left,$middle,$right); } print_r(quickSort($arr)); ?>
二、选择排序法
1.选择排序法
<?php //选择排序法(升序) $arr = array(8,7,6,5,3,1); function selectSort(&$arr) { //外循环控制循环趟数,n个数循环n-1趟 for($i=0; $i<count($arr)-1; $i++) { //假设当前趟数的第一个数为最值,记在$k下标中 $k = $i; //从下个数到最后一个数之间找最值 for($j=$k+1; $j<count($arr); $j++) { //若其后有比最值更小的 if($arr[$k]>$arr[$j]) { //则将其下标记在$k中 $k = $j; } } //若$k不为最初的i值,说明在其后找到比其更大的数 if($k != $i) { //则交换最值和当前序列的第一个数 $temp = $arr[$i]; $arr[$i] = $arr[$k]; $arr[$k] = $temp; } } } selectSort($arr); print_r($arr); ?>
算法特点:每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。
算法分析:定义外部n-1次循环,假设第一个为最值,放在参数中,在从下一个数以后找最值若后面有比前面假设的最值更大的就放在k中,然后在对k进行分析。若k不位最初的i值。也就是假设的i不是最值,那么就交换最值和当前序列的第一个数。
2.堆排序
三、插入式排序法
1.插入排序法
<?php //插入排序法(升序) $arr = array(5,10,3,2,1,0); function insertSort(&$arr) { //外层循环,假设第一个数为排好的数,从第二个数开始循环 for($i=1; $i<count($arr); $i++) { //将当前循环的数先保存在临时变量中 $temp = $arr[$i]; //内层循环,待插入的位置 $j=$i-1; for($j; $j>=0; $j--) { //从后往前比较,比前一个元素小 if($arr[$j]>$temp) { //把大的数往后移 $arr[$j+1]=$arr[$j]; } else { break; } } if(($j+1)!= $i) { //找到正确位置,插入事前保存的元素 $arr[$j+1]=$temp; } } } insertSort($arr); print_r($arr); ?>
2.希尔排序法
【外部排序法:借助外部文件排序】
注:如果将排序法封装成一个函数,以便日后直接调用该函数排序,可使用返回值,或形参加地址符【&】,如:&$arr