PHP中数组的三种排序方法分享

时间:2022-10-24 12:13:07

一、冒泡排序法 
说明:找到最大的数,排列到最后面,然后继续找 

例: 

复制代码代码如下:


$arr = array(3,5,-1,0,2); 
for($i=0;$i<count($arr)-1;$i++){ 
for($j=0;$j<count($arr)-1-$i;$j++){ 
if($arr[$j]>$arr[$j+1]){ 
$temp = $arr[$j]; 
$arr[$j]=$arr[$j+1]; 
$arr[$j+1]=$temp; 



理解: 
3,5,-1,0,2 
//从第一个数开始往后比较,如果比后面的数大则与后面的数调位置 
//第一次,3小于5,那么不变 
//第二次,5大于-1,那么变成 
3,-1,5,0,2 
//第三次,5大于0 
3,-1,0,5,2 
//第四次,5大于2 
3,-1,0,2,5 
至此完成一次内循环,此时最后一个数完成排序,下次将不参与 
3,-1,0,2,5第二次外循环开始 第一次:3大于-1 
-1,3,0,2,5 
第二次:3大于0 
-1,0,3,2,5 
第三次:3大于2 
-1,0,2,3,5 
至此完成后面两位数的排序了,接下来类推 
-1,0,2,3,5 
二、选择排序法 
说明:先假设第一个数就是最小的数,然后将后面的数依次与它比较,如果假设的数不是最小的数,就将它与后面的最小的数调换位置 

复制代码代码如下:


$arr=array(2,1,-1,3,0); 
for($i=0;$i<count($arr)-1;$i++){ 
$minval = $arr[$i]; 
$minindex = $i; 
for($j=1+$i;$j<count($arr);$j++){ 
if($arr[$j]<$minval){ 
$minval = $arr[$j]; 
$minindex = $j; 


$temp = $arr[$i]; 
$arr[$i] = $arr[$minindex]; 
$arr[$minindex] = $temp; 


理解: 
2,1,-1,3,0 
//先假设第一个数2为最小值,它后面的数依次与2做比较,寻找到最小的那个数 
过程: 
1小于2,那么minval=1 
-1小于1,那么minval=-1 
3大于-1,不变 
0大于-1,不变 
那么现在就找到了该数组中最小的数了为-1 
将-1与2调换位置就完成第一个数的排序了 
那么现在数组变成 
-1,1,2,3,0 
现在第一个数-1已经为有序,所以不参与比较了,往后面继续 
现在假设minval=1 
2大于1,不变 
3大于1,不变 
0小于1,那么minval=0 
现在一次循环完成,调换0与1的位置完成第二个数的排序 
那么现在数组变成 
-1,0,2,3,1 
//后面的推法与上面相同。。。 

三、插入排序法

说明:先假设一个数组中的第一个数为单独的有序数组,再将后面的一个数与它【这里随它I的增长,就变成它们了】做比较,如果后面的数比假设的数还小,则将小的那个数后移,最后将那个数移到最前面 

复制代码代码如下:


$arr=array(2,1,-1,3,0); 
for($i=1;$i<count($arr);$i++){ 
$insertval=$arr[$i]; 
$insertindex = $i-1; 
while($insertindex>=0 && $insertval<$arr[$insertindex]){ 
$arr[$insertindex+1]=$arr[$insertindex]; 
$insertindex--; 

$temp = $arr[$i]; 
$arr[$insertindex+1]=$insertval; 


理解: 
2,1,-1,3,0 
//第一次,先保存待插入的数1为insertval,再拿 insertval 与2比较,1小于2,所以把2后移,变成如下的图 
2,2,-1,3,0 
//此时2前面没有数字了,insertindex=0,所以比较完成,那么将insertval插入到寻找到的这个位置。变成如下图 
1,2,-1,3,0 
//此时,1,2变成有序数组 
//第二次,先保存待插入的数-1为insertval,再拿insertval与2做比较,-1小于2,所以把2后移,变成如下图 
1,2,2,3,0 
//此时,再拿insertval与1做比较,-1小于1,那么把-1后移,变成如下图(这就是一个拿待插入数与前面的有序数组比较的过程) 
1,1,2,3,0 
//此时,insertindex到头了,所以将insertval插入该位置 
-1,1,2,3,0 
//后面推法如上