PHP排序算法

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

分别使用插入排序法,冒泡排序法,选择排序法,快速排序法,将下面数组中的值进行按照从小到大的顺序进行排序操作。

1
$arr (12,43,57,32,51,76,36,91,28,46,40);


1、插入排序法

分析:既定前面数字已经排好顺序,现在要把第n个数字插入到前面有序的数组中,使得这n个数字也是有序的放入其中,如此反复循环直至全部排好顺序。

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$arr (12,43,57,32,51,76,36,91,28,46,40);
function  insertSort( $arr ) {
     $len = count ( $arr ); 
     for ( $i =1,  $i < $len $i ++) {
         $tmp  $arr [ $i ];
         for ( $j = $i -1; $j >=0; $j --) {
             if ( $tmp  $arr [ $j ]) {
                 //比较大小当数字小时交换位置,将后面的数字与前面的数字进行互换操作
                 $arr [ $j +1] =  $arr [ $j ];
                 $arr [ $j ] =  $tmp ;
             else  {
                 //不需要,直接跳过
                 break ;
             }
         }
     }
     return  $arr ;
}


2、冒泡排序法

分析:从前往后对相邻的两个数字依次进行比较调整,让较大的数字往下沉,让较小的数字往上升,即每相邻的数字进行对比排序,顺序不符合时将其调换位置。

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$arr (12,43,57,32,51,76,36,91,28,46,40);
function  bubbleSort( $arr )
{  
   $len = count ( $arr );
   for ( $i =1; $i < $len ; $i ++)
   //循环比较次数
     for ( $k =0; $k < $len - $i ; $k ++)
     {
        if ( $arr [ $k ]> $arr [ $k +1])
         {
             $tmp = $arr [ $k +1];
             $arr [ $k +1]= $arr [ $k ];
             $arr [ $k ]= $tmp ;
         }
     }
   }
   return  $arr ;
}


3、选择排序法

分析:选出最小的一个数字与第一个位置数字交换,之后再剩余的数当中再次找到最小的数字与第二个位置交换,依此循环到倒数第二个数字和最后一个数字比较结束为止。

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$arr (12,43,57,32,51,76,36,91,28,46,40);
function  selectSort( $arr ) {
  $len = count ( $arr );
     for ( $i =0;  $i < $len -1;  $i ++) {
         //假设最小值的位置
         $p  $i ;
         for ( $j = $i +1;  $j < $len $j ++) {
             //$arr[$p] 已知的最小值
             if ( $arr [ $p ] >  $arr [ $j ]) {
             //比较发现更小的记录下最小值的位置,并且在下次比较时采用已知的最小值进行比较。
                 $p  $j ;
             }
         }
         //确定当前最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
         if ( $p  !=  $i ) {
             $tmp  $arr [ $p ];
             $arr [ $p ] =  $arr [ $i ];
             $arr [ $i ] =  $tmp ;
         }
     }
     return  $arr ;
}


4、快速排序法

分析:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$arr (12,43,57,32,51,76,36,91,28,46,40);
function  quickSort( $arr ) {
     //判断是否继续进行
     $length  count ( $arr );
     if ( $length  <= 1) {
         return  $arr ;
     }
     //选择第一个数字作为基准
     $base_num  $arr [0];
     //遍历除了基准外的所有数字,按照大小关系放入两个数组内,之后初始化两个数组
     $left_array  array ();   //小于基准
     $right_array  array ();   //大于基准
     for ( $i =1;  $i < $length $i ++) {
         if ( $base_num  $arr [ $i ]) {
             //放入左边数组
             $left_array [] =  $arr [ $i ];
         else  {
             //放入右边数组
             $right_array [] =  $arr [ $i ];
         }
     }
     //分别对两数组进行相同的排序处理方式递归
     $left_array  = quick_sort( $left_array );
     $right_array  = quick_sort( $right_array );
     //合并数组
     return  array_merge ( $left_array array ( $base_num ),  $right_array );
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值