(转)PHP排序算法的复习和总结

对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort  arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。

直接上代码吧!

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<?php
/*
  * 插入排序(一维数组)
  * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
  */
function  insertSort( $arr ){
     if (! is_array ( $arr ) ||  count ( $arr )==0){
         return  $arr ;
     }
     $count  count ( $arr );
     for ( $i =1;  $i < $count $i ++){
         if (isset( $arr [ $i ])){
          $tmp  $arr [ $i ];  //获取后一个元素的值
          $j  $i  - 1;  //获取前面的下标
          while ( $arr [ $j ] >  $tmp ){  //如果前面一个比后面一个大, 这里是从小到大
              $arr [ $j +1] =  $arr [ $j ];  //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个
              $arr [ $j ] =  $tmp ;
              $j --;
         }
         }
     }
     return  $arr ;
}
  
/*
  * 选择排序(一维数组)
  * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
  */
function  selectSort( $arr ){
     if (! is_array ( $arr ) ||  count ( $arr ) == 0)
     {
         return  $arr ;
     }
     $count  count ( $arr );
     for ( $i =0;  $i < $count $i ++){
         $k  $i ;
         for ( $j = $i +1;  $j < $count $j ++){
        if  ( $arr [ $k ] >  $arr [ $j ])
          $k  $j //找出最小的
          if  ( $k  !=  $i ){
              $tmp  $arr [ $i ];
              $arr [ $i ] =  $arr [ $k ];
              $arr [ $k ] =  $tmp ;
           }
        }
     }
     return  $arr ;
}
 
/*  
  * 冒泡排序(一维数组)
  * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止
  */
function  bubbleSort( $array ){
     $count  count ( $array );
     if  ( $count  <= 0) {
         return  false;
     }
     for ( $i =0;  $i < $count $i ++){
         for ( $j = $count -1;  $j > $i $j --){
             if  ( $array [ $j ] <  $array [ $j -1]){  //比较找到的数进行交换
              $tmp  $array [ $j ];
              $array [ $j ] =  $array [ $j -1];
              $array [ $j -1] =  $tmp ;
            }
         }
     }
     return  $array ;
}
  
/*
  * 快速排序(一维数组)
  *
  */
function  quickSort( $array ){
     if  ( count ( $array ) <= 1){
         return  $array ;
     }
     $key  $array [0];
     $left_arr  array ();
     $right_arr  array ();
     for  ( $i =1;  $i < count ( $array );  $i ++){
        if  ( $array [ $i ] <=  $key ){
             $left_arr [] =  $array [ $i ];
       } else {
           $right_arr [] =  $array [ $i ];
         }
     }
     $left_arr  = quickSort( $left_arr );
     $right_arr  = quickSort( $right_arr );
     return  array_merge ( $left_arr array ( $key ),  $right_arr );
}
 
/**
   * 按照元素的值进行排序
   * strOrder 为排列的顺序 asc 升序  desc 降序
   */
function  sortByVal( $arr , $strOrder = 'asc' )
{
     if (! is_array ( $arr ) ||  count ( $arr )==0)
     {
         return  $arr ;
     }
 
     $arrReturn  array ();
     foreach ( $arr  as  $key => $val )
     {
         $arrKey [] =  $key ;
         $arrVal [] =  $val ;
     }
 
     $count  count ( $arrVal );
     if ( $count )
     {
         //创建key的顺序数组
         for ( $key =0; $key < $count ; $key ++)
         {
             $arrKeyMap [ $key ] =  $key
         }
         //对值进行排序
         for ( $i =0; $i < $count ; $i ++)
         {  
             
             for ( $j  $count -1;  $j > $i ; $j --)
             {
                 //<从小到大排列 升降在这修改
                 $bol  $strOrder  ==  'asc'  $arrVal [ $j ]< $arrVal [ $j -1] :  $arrVal [ $j ]> $arrVal [ $j -1];
                 if ( $bol ){
                     $tmp  $arrVal [ $j ];
                     $arrVal [ $j ] =  $arrVal [ $j -1];
                     $arrVal [ $j -1] =  $tmp ;
                     //值的冒泡排序,引起key的数组的交互   
                     $keytmp  $arrKeyMap [ $j ];
                     $arrKeyMap [ $j ] =  $arrKeyMap [ $j -1];
                     $arrKeyMap [ $j -1] =  $keytmp ;
                 }
             }
         }
         if ( count ( $arrKeyMap ))
         {
             foreach  ( $arrKeyMap  as  $val )
             {
                     $arrReturn [] =  $arrKey [ $val ];
             }
         }
         return  $arrReturn ;
     }
}
 
 
/**
   * 使用原生的函数进行数组按照值进行排列
   */
function  arraySortByVal( $arr , $keys , $type = 'asc' ){
     $keysvalue  $new_array  array ();
     foreach  ( $arr  as  $k => $v ){
         $keysvalue [ $k ] =  $v [ $keys ];
     }
     if ( $type  ==  'asc' ){
         asort( $keysvalue );
     } else {
         arsort( $keysvalue );
     }
     reset( $keysvalue );
     foreach  ( $keysvalue  as  $k => $v ){
         $new_array [ $k ] =  $arr [ $k ];
     }
     return  $new_array ;
}

  

对于下面的2个对于array的值进行排序的方法一个是自己实现的一个是使用了原生的PHP函数的,其实排序对于少量数据一般就单页的数据量的数据还是可以的,如果涉及到大量的数据的排序,建议可以整合到MYSQL的基础类中来进行。

转载于:https://www.cnblogs.com/junfan/p/5110194.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值