一:冒泡排序算法

    冒泡排序(Bubble Sort)算法是一种典型的交换排序算法,通过两两数据交换进行排序。如果有n个数,则要进行n-1趟比较,在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。

  复杂度分析:冒泡排序需要次交换。

 <?php
/**
*冒泡排序算法
**/ //定义一个数组,并赋值
$arr=array(3,5,8,4,9,6,1,7,2); //封装一个方法BubbleSort
function BubbleSort($arr){ $length=count($arr);//count()函数是计算数组中单元数目或者对象中的属性个数 if($length<=1){
return $arr;
} for($i=0;$i<$length-1;$i++){
for($j=0;$j<$length-1-$i;$j++){
if($arr[$j]>$arr[$j+1])
$t=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$t;
}
}
} return $arr;
} echo '冒泡排序:';
echo implode(',',BubbleSort($arr))."<br/>";

  运行结果如下:

  

  上面是升序排序,如果是倒序的话,将代码第20行>改为<。

二:快速排序算法

  快速排序(Qucik Sort)又称划分交换排序,快速排序的基本思想是划分、分治,递归。

  在平均状况下,排序个项目要(大O符号)次比较。在最坏状况下则需要次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。

 <?php
/**
**快速排序算法
**快速排序的基本思想是划分,分治,递归。
**第一步是划分,将整个数组划分为两个部分,第一部分所有值小于基准值,
** 第二部分所以值大于基准值。基准值的选择随机,一般选择待排数组的第一个元素。划分规则在下方。
**第二步:分治递归。第一步将数组划分为两部分后,两部分内部还不是有序的,
** 再分别对两部分进行递归快速排序,最终得到一个完整的有序数组
**/ //定义一个数组,并赋值
$arr=array(3,5,8,4,9,6,1,7,2); //快速排序方法
function QSort($arr){
$length=count($arr);//count()函数是计算数组中单元数目或者对象中的属性个数 if($length<=1){
return $arr;
} $pivot=$arr[0];//枢纽(默认拿第一个数组元素作为枢纽)
$left_arr=array();
$right_arr=array();
for($i=1;$i<$length;$i++){//注意$i从1开始,0下标的已被作为枢纽
if($arr[$i]<=$pivot){
$left_arr[]=$arr[$i];
}else{
$right_arr[]=$arr[$i];
}
} $left_arr=QSort($left_arr);//递归排序左半部分
$right_arr=QSort($right_arr);//递归排序右半部分 return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分,枢纽,右半部分
} echo '快速排序:';
echo implode(',',QSort($arr))."<br/>";

  运行结果如下:

  

三:选择排序算法

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

  选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的序列进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。交换次数比冒泡排序较少。

 <?php
/**
**选择排序算法
**/
$arr = array(1,0,2,9,3,8,4,7,5,6);
//用函数封装选择排序法
function SelectSort($arr){
//定义一个中间变量
$t=0; //升序排序
for($i=0;$i<count($arr)-1;$i++){
//假设$i就是最小的数
$minvalue=$arr[$i];
//记录最小数的下标
$minkey=$i; for($j=$i+1;$j<count($arr);$j++){
if($minvalue>$arr[$j]){ //升序排序
$minvalue=$arr[$j];
$minkey=$j;
}
} //最后交换
$t=$arr[$i];
$arr[$i]=$arr[$minkey];
$arr[$minkey]=$t;
} return $arr;
}
echo "选择排序:".implode(',',SelectSort($arr));//implode()函数是将一个数组转为字符串

  运行结果如下:

  

四:插入排序算法

  插入排序(Insert Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千;或者若已知输入元素大致上按照顺序排列,那么插入排序还是一个不错的选择。

  复杂度分析:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。 最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需n-1次即可。 最坏情况就是,序列是降序排列,那么此时需要进行的比较共有2/1n(n-1)次。插入排序的赋值操作是比较操作的次数减去次,(因为n-1次循环中,每一次循环的比较都比赋值多一个,多在最后那一次比较并不带来赋值)。平均来说插入排序算法复杂度为

 <?php
$arr=array(1,0,2,9,3,8,4,7,5,6);
function InsertSort($arr){
$length=count($arr);
if($legth<=1){
return $arr;
}
for($i=0;$i<$length-1;$i++){
$t=$arr[$i];//默认排序好的是第一个 $t为未排序好的第一个数据
for($j=$i-1;$j>=0;$j--){//排序好的的最后一个数据跟未排序好的第一个数据比较
if($t<$arr[$j]){
$arr[$j+1]=$arr[$j];
$arr[$j]=$t;
}
}
}
return $arr;
}
echo "插入排序:".implode(',',InsertSort($arr));

  运行结果如下:

  

五:算法补充:求一组队列中负数和正数的个数(队列长度大于1无疑问)

 <?php
//定义一个数组变量并且赋值
$array=array(1,3,4,-1,5,-5,9,8); //封装一个名为Ceshi的方法,
function Ceshi($array,&$a,&$b){//形参,&是传引用
//count()函数是php自带的求一个数组长度的函数
$length=count($array);
//设两个变量用来计数并且初始化
$a=0;
$b=0;
for($i=0;$i<$length-1;$i++){
if($array[$i]>0){//如果数组元素>0,就将$a加1
$a++;//后面不需要return
}else{
$b++;
}
}
return $array;//不能省略 }
Ceshi($array,$a,$b);//实参
echo 'a='.$a.' b='.$b;//.是将他们连接起来的意思

运行结果:

软件测试开发人员需要掌握的一些基本数据结构算法(php编写)的更多相关文章

  1. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  2. 基于python的互联网软件测试开发(自动化测试)-全集合

    基于python的互联网软件测试开发(自动化测试)-全集合 1   关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...

  3. 怎样才能提交一个让开发人员拍手叫好的bug单

    怎样才能提交一个让开发人员拍手叫好的bug单 软件测试人员写得最多的文档就是测试用例和BUG,现在测试用例和BUG都没有标准的模板,每个公司使用的缺陷管理工具都有可能不一样,如果你换了一家公司就有可能 ...

  4. Java开发人员必备十大工具

    Java世界中存在着很多工具,从著名的IDE(例如Eclipse,NetBeans和IntelliJ IDEA)到JVM profiling和监视工具(例如JConsole,VisualVM,Ecli ...

  5. IE的F12开发人员工具不显示问题

    按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的缩略图上,右键-最大化,工具就全屏出现 ...

  6. .NET CoreCLR开发人员指南(上)

    1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...

  7. 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南

    欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...

  8. AWS开发人员认证考试样题解析

    最近在准备AWS的开发人员考试认证.所以特意做了一下考试样题.每道题尽量给出了文档出处以及解析. Which of the following statements about SQS is true ...

  9. IE开发人员工具之实用功能讲解

    F12快捷键调出开发人员工具 一.JS的内容格式化 1.内容较乱的js脚本: 2.勾选下面两项即可进行格式化脚本:自动换行与格式化JS 3.调理清楚的脚本 二:清空控制台 1.右键->清空 2. ...

随机推荐

  1. java上传超大文件

    上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败. 一开始以为是session过期或者文件大小受系统限制,导致的错误.查看了系统的配置文件没有看到文件大小限制,web.xml中sees ...

  2. List集合类

    1.1:  List.add方法——向集合列表中添加对象 public static void main(String[] args) { List<String> list=new Ar ...

  3. Turn Off Windows Firewall Using PowerShell and CMD

    If you want to turn off the Windows Firewall, there are three methods. One is using the GUI which is ...

  4. Ubuntu 源 (ros)

    deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://archive. ...

  5. 微信小程序入门与实战 从0到1进行细致讲解 涵盖小程序开发核心技能下载

    第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...

  6. Telegraf+Influxdb+Grafana(Windows下本机简易监控系统搭建)

    1.文件名称 telegraf-1.5.0_windows_amd64.zip influxdb-1.4.2_windows_amd64.zip grafana-4.6.3.windows-x64.z ...

  7. CentOS 7 安装MySQL8

    安装 下载Linux对应的MySQL https://dev.mysql.com/downloads/mysql/ CentOS选择Red Hat Enterprise Linux 在/usr/loc ...

  8. CSRF in asp.net mvc and ap.net core

    如果在方法上添加了[ValidateAntiForgeryToken],没处理好 请求没有带参数 2019-09-17 14:02:45,142 ERROR [36]: System.Web.Mvc. ...

  9. lintcode刷题笔记(一)

    最近开始刷lintcode,记录下自己的答案,数字即为lintcode题目号,语言为python3,坚持日拱一卒吧... (一). 回文字符窜问题(Palindrome problem) 627. L ...

  10. OpenJudge计算概论-异常细胞检测

    /*======================================================================== 异常细胞检测 总时间限制: 1000ms 内存限制 ...