下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PHP数组排序之sort、asort与ksort用法实例_ 一、插入排序 用文字简洁的描述,比如说$arr = array(4,2,4,6,3,6,1,7,9); 这样的一组数字进行挨次排序: 那么,首先,拿数组的其次个元素和第一元素比较,假如第一个元素大于其次元素,那么就让两者位置互换,接下来,拿数组的第三个元素,分别和其次个,第一个元素比较,假如第三个元素小,那么就互换。依次类推。这就是插入排序,它的时间频度是:1+2+.+(n-1)=(n2)/2。则它的时间简单度为O(n2). php实现代码如下: 01?php 02function insertSort($arr) 03 $count
2、 = count($arr); 04 if($count2) 05 return $arr; 06 07 for($i=1;$i$count;$i+) 08 $tmp = $arr$i; 09 $j=$i-1; 10 while(j=0$arr$j$arr$i) 11 $arr$i = $arr$j; 12 $arr$j = $tmp; 13 $j-; 14 15 16 return $arr; 17 18? 二、选择排序 选择排序用语言描述的话,可以这样,如:$arr = array(4,3,5,2,1); 首先,拿第一个和后面全部的比,找出最小的那个数字,然后和第一个数组互换(当然,假如是
3、第一个最小,那么就不用互换了),接着循环,即:拿其次个和后面的比较,找出最小的数字,然后和其次个数字互换,依次类推,也就是说每次都是找出剩余最小的值。 可得到:第一次,时间频度 是n, (第一个和后面的n1个比较,找到最小的,再看是不是第一个,不是第一个的话进行互换) 在往后,依次是 减一 。 它的时间简单度,也是O(n2); php实现代码如下: 01?php 02function selectSort($arr) 03 04 $count = count($arr); 05 if($count2) 06 return $arr; 07 08 for($i=0;$i$count;$i+) 0
4、9 $min=$i; 10 for(j=$i+1;$j$count;$j+) 11 if($arr$min$arr$j) 12 $min = $j; /找到最小的那个元素的下标 13 14 15 if($min!=$i)/假如下标不是$i 则互换。 16 $tmp= $arr$i; 17 $arr$i = $arr$min; 18 $arr$min = $tmp; 19 20 21 return $arr; 22 23? 三、冒泡排序 冒泡排序其实上是和选择排序相比,并无明显差别。都是找到最小的,放到最左端。依次循环解决问题。差别在于冒泡排序的交换位置的次数较多,而选择排序则是找到最小的元素的
5、下标,然后挺直和最左端的交换位置。 php实现代码如下: 01?php 02function selectSort($arr) 03 04 $count = count($arr); 05 if($count2) 06 return $arr; 07 08 for($i=0;$i$count;$i+) 09 for(j=$i+1;$j$count;$j+) 10 if($arr$i$arr$j) 11 $tmp= $arr$i; 12 $arr$i = $arr$i; 13 $arr$i = $tmp; 14 15 16 17 return $arr; 18 19? 四、快速排序 快速排序,用
6、语言来形容的话,从数组中选择一个值$a,然后和其余元素进行比较,比$a大的放到数组right中,反之,放到数组left中。然后将left right 分别进行递归调用,即:再细分left right ,最终进行数组的合并。 php实现快速排序: 01?php 02function mySort($arr) 03 04 $count = count($arr); 05 if($count2) 06 return $arr; 07 08 $key = $arr0;/选择第一个元素作为比较元素,可选其他 09 $left = array(); 10 $right = array(); 11 for(
7、$i=1;$i$count;$i+) 12 if($key=$arr$i) 13 $left = $arr$i; 14 else 15 $right = $arr$i; 16 17 18 $left = mySort($left); 19 $right = mySort($right); 20 $result = array_merge($left,$right); 21 return $result; 22 23? 五、归并排序 其实归并排序是一种拆分,合并的思想。和快速排序思想有共通之处,左边一堆,右边一堆,然后进行合并。通过递归实现排序。 区分之处呢? 他们的区分也是思想上本质的区分,快
8、速排序的拆分,是选择了特定的值进行大小比较,从而分为left 和 right 。也就是小的一堆放入left,大的一堆放入right。而后,小的left 再细分为left1 right1。通过进行类似的递归完成排序。也就是说,始终细分下去,递归最末尾的left1就是最小值。 而归并排序,是从几何上的左右切分,始终递归切分成2或者1的最小粒度的数组,然后才开头进行比较大小,然后合并。此处的比较大小是:儿子left的元素 和儿子的right元素 进行比较,而后进行排序合并成为父亲left或者right。在此,直到拿到各自排序合并完成最终两个数组:最起初的left 和right,也仅仅直到他们各自的挨
9、次,并不能确认整个数组的挨次,还是需要通过最终的left right 比较后合并才能完成真正意义上的排序。 01?php 02function gbSort($arr) 03 if(count($arr)=1)return $arr; 04 $min = floor(count($arr)/2);/取中间数字进行拆分 05 $left = array_slice($arr,0,$min); 06 $right = array_slice($arr,$min); 07 $left = gbSort($left); /递归 08 $right = gbSort($right); 09 return
10、 get_merge($left,$right);/调用排序合并函数进行合并 10 11function get_merge($left,$right) 12 while(count($left) count($right) 13 $m = $left0$right0 ? array_shift($right) : array_shift($left); 14 /进行比较,小的移除,并且放入到数组$m中。 15 16 return arr_merge($m,$left,$right);/进行合并(由于不知道left right 哪个会为空,所以进行统一合并) 17 18 19? 六、堆排序 本
11、例中fixDown函数实现对某一个节点的向下调整,这里默认的是起始节点为1,便利计算父子节点关系 注: 起始节点为1的父子关系: 父节点k, 子节点为2K、2k+1 子节点j, 父节点为 floor(j/2) floor为向下取整 起始节点为0的父子关系: 父节点k, 子节点为2K+1, 2k+2 子节点j, 父节点为 floor(j-1)/2) 参数$k为调整点位置, $lenth为数组长度,也就是从1起始到最终一个节点的坐标. 01?php 02function fixDown($arr, $k, $lenth) 03 04while(2*$k=$lenth) /只要当前节点有子节点, 就
12、需要连续该循环 05 $j = $k*2; 06 if ($j$lenth $arr$j$arr$j+1) $j+; / 只要子节点有右节点,且右节点比左节点大,那么切换到右节点操作。 07 if ($arr$j $arr$k) break; / 假如子节点都没有父节点大, 那么调整结束。 08 exch($arr$j, $arr$k); 09 $k = $j; 10 11 12 13function exch($a, $b) 14 $tmp = $a; $a = $b; $b = $tmp; 15 16 17function headSort($arr) 18 19 $len = count
13、($arr); 20 array_unshift($arr, NULL); 21 for($i=$len/2;$i=1;$i-) 22 fixDown($arr, $i, $len); 23 24 while($len1) 25 exch($arr1, $arr$len); 26 fixDown($arr, 1, -$len); 27 28 array_shift($arr); 29 本文实例讲解了PHP数组排序中sort、asort与ksort的用法,供大家参考借鉴之用。具体实例如下所示: 01?php 02$arr = array(d=sdf, r=sdf, a= eee); 03/sort($arr); / 对数组的值进行重排, 删除之前的键值, 变为索引数组 04/asort($arr); / 对数组根据值进行重排,并保持索引关系,索引数组和关联数组均适用 05ksort($arr); / 对数组根据键值进行重排,并保持索引关系,索引数组和关联数组均适用 06 07/ 对应逆序还有rsort arsort krsort 08/ 用法函数比较有usort uksort uasort 其次个参数为比较的函数 需要在第一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 确认年终绩效考核标准函(8篇)范文
- 二手交易平台商品交易规范标准手册
- 企业间合作信任系统建立承诺书8篇
- 职业培训效果显著承诺书范文3篇
- 服务类业务快速响应承诺书(6篇)
- 市场调查问卷寄送信函(9篇)
- 濒危动物救护与保护承诺书范文7篇
- 营销活动策划执行方案参考模板
- 护理课件教学反馈机制研究
- 创新科技项目质量保证承诺书(4篇)
- TCI 373-2024 中老年人免散瞳眼底疾病筛查规范
- 河南省中小学校本课程建设案例评选申报表
- 组织机构设置、人员配置及职责分工
- 天疱疮护理查房
- 学生心理健康一生一策档案模板
- 2024年海南省农垦投资控股集团有限公司招聘笔试参考题库含答案解析
- 高危药品管理护理课件
- 中职数学基础模块下册第8.4.1《圆的标准方程》说课课件
- 教育评价与考试改革的实践与成果培训课件
- S快递公司服务质量问题及研究对策 工商管理专业
- 水影响评价报告编制收费标准
评论
0/150
提交评论