PHP排序之选择排序

 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n -1 次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种

 1 <?php
 2         $arr = array(12, 234, 33, 23, 1, 54, 0);
 3         $ar = array(
 4             array('name'=>'liming', 'sex'=>'male', 'score'=>90),
 5             array('name'=>'asd', 'sex'=>'male', 'score'=>89),
 6             array('name'=>'bdf', 'sex'=>'female', 'score'=>92),
 7             array('name'=>'rgeg', 'sex'=>'male', 'score'=>60)
 8         );
 9         
10         //交换两个数
11         function swap(&$x, &$y){
12             $temp = $x;
13             $x = $y;
14             $y = $temp;
15         }
16         
17         //选择排序
18         function xuanze1(&$a){
19             $t = count($a);
20             for($i=0; $i<$t-1; $i++){
21                 $k = $i;
22                 for($j=$i+1; $j<$t; $j++){
23                     if($a[$j]<$a[$k]){
24                         $k = $j;
25                     }
26                 }
27                 if($k != $i){
28                     swap($a[$i], $a[$k]);
29                 }
30             }
31         }
32         //双向选择排序
33         function xuanze2(&$a){
34             $t = count($a);
35             $low = 0;
36             $high = $t-1;
37             while($low < $high){
38                 print_r($a);
39                 echo "<br/>";
40                 $min = $low;
41                 $max = $high;
42                 for($i=$low; $i<=$high; $i++){
43                     if($a[$i]>$a[$max]){
44                         $max = $i;
45                     }else if($a[$i]<$a[$min]){
46                         $min = $i;
47                     }
48                 }
49                 if($min != $low){
50                     swap($a[$low], $a[$min]);
51                 }
52                 if($min==$high && $max==$low){
53                     //当最小数出现在最右端,同时最大数出现在最左端,会出现交换两次的情况
54                 }
55                 else if($max!=$high){
56                     swap($a[$high], $a[$max]);
57                 }
58                 $low++;
59                 $high--;
60             }
61         }
62         
63         //二维数组选择
64         function xuanze3(&$a, $key){
65             $t = count($a);
66             for($i=0; $i<$t-1; $i++){
67                 $k = $i;
68                 for($j=$i+1; $j<$t; $j++){
69                     if($a[$j][$key] < $a[$k][$key]){
70                         $k = $j;
71                     }
72                 }
73                 if($k != $i){
74                     swap($a[$k], $a[$i]);
75                 }
76             }
77         }
78 ?>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值