PHP四种基本排序算法示例


Posted in PHP onApril 09, 2015

许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。

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

$arr(1,43,54,62,21,66,32,78,36,76,39);

1. 冒泡排序

思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

代码实现:

$arr=array(1,43,54,62,21,66,32,78,36,76,39); 
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;
}

2. 选择排序

思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码实现:

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;
}

3.插入排序

思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

代码实现:

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;
}

4.快速排序 

思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

代码实现:

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);
}
PHP 相关文章推荐
PHP中在数据库中保存Checkbox数据(2)
Oct 09 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
php_pdo 预处理语句详解
Nov 21 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
PHP支付宝当面付2.0代码
Dec 21 PHP
laravel框架如何设置公共头和公共尾
Oct 22 PHP
Laravel 5 框架入门(三)
Apr 09 #PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 #PHP
Laravel 5 框架入门(一)
Apr 09 #PHP
Smarty中的注释和截断功能介绍
Apr 09 #PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 #PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 #PHP
Laravel 5框架学习之用户认证
Apr 09 #PHP
You might like
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python绘制七段数码管实例代码
2017/12/20 Python
python 调用钉钉机器人的方法
2019/02/20 Python
python视频按帧截取图片工具
2019/07/23 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
夏洛特的网观后感
2015/06/15 职场文书
运动员入场前导词
2015/07/20 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android