软件测试开发人员需要掌握的一些基本数据结构算法(php编写)
一:冒泡排序算法
冒泡排序(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编写)的更多相关文章
- 写给Android App开发人员看的Android底层知识(1)
这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...
- 基于python的互联网软件测试开发(自动化测试)-全集合
基于python的互联网软件测试开发(自动化测试)-全集合 1 关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...
- 怎样才能提交一个让开发人员拍手叫好的bug单
怎样才能提交一个让开发人员拍手叫好的bug单 软件测试人员写得最多的文档就是测试用例和BUG,现在测试用例和BUG都没有标准的模板,每个公司使用的缺陷管理工具都有可能不一样,如果你换了一家公司就有可能 ...
- Java开发人员必备十大工具
Java世界中存在着很多工具,从著名的IDE(例如Eclipse,NetBeans和IntelliJ IDEA)到JVM profiling和监视工具(例如JConsole,VisualVM,Ecli ...
- IE的F12开发人员工具不显示问题
按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的缩略图上,右键-最大化,工具就全屏出现 ...
- .NET CoreCLR开发人员指南(上)
1.为什么每一个CLR开发人员都需要读这篇文章 和所有的其他的大型代码库相比,CLR代码库有很多而且比较成熟的代码调试工具去检测BUG.对于程序员来说,理解这些规则和习惯写法非常的重要. 这篇文章让所 ...
- 第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南
欢迎查看第六代智能英特尔® 酷睿™ 处理器图形 API 开发人员指南,该处理器可为开发人员和最终用户提供领先的 CPU 和图形性能增强.各种新特性和功能以及显著提高的性能. 本指南旨在帮助软件开发人员 ...
- AWS开发人员认证考试样题解析
最近在准备AWS的开发人员考试认证.所以特意做了一下考试样题.每道题尽量给出了文档出处以及解析. Which of the following statements about SQS is true ...
- IE开发人员工具之实用功能讲解
F12快捷键调出开发人员工具 一.JS的内容格式化 1.内容较乱的js脚本: 2.勾选下面两项即可进行格式化脚本:自动换行与格式化JS 3.调理清楚的脚本 二:清空控制台 1.右键->清空 2. ...
随机推荐
- 003_Python3 基本数据类型
1.Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存 ...
- fdisk分区命令
fdisk是Linux系统中最常用的分区工具,通过这个命令也可以查看系统中所有可用的分区,但是这个命令只支持MBR的分区表(这句话应该只对某些系统,CentOS7-1810适用,Debian9.5和o ...
- Bzoj 1280: Emmy卖猪pigs
1280: Emmy卖猪pigs Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 279 Solved: 182[Submit][Status][Dis ...
- JavaEE三层架构与MVC
JavaEE三层架构与MVC 摘要与总结 等下总结下 MVC模式 Model1 说到设计模式,不得不提一下之前的的Model1.据说早期对于java企业项目的开发,用的是Jsp+JavaBean的 ...
- 1823:【00NOIP提高组】方格取数
#include<bits/stdc++.h> using namespace std; ][]; ][][][]; inline int max(int x,int y) { retur ...
- combobox放入数据
页面 <th width="15%">国际分类号</th><td width="30%"> <select cla ...
- 走进JavaWeb技术世界9:Java日志系统的诞生与发展
本文转自[码农翻身] ## 一个著名的日志系统是怎么设计出来的? # 1前言 Java帝国在诞生之初就提供了集合.线程.IO.网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无 ...
- 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础
1.实践过程记录 1.字符串型注入. 2.整数型注入 3.注入语句查看其他内容 4.xss是一种漏洞,这种漏洞允许用户输入脚本并且浏览器提交的时候不加编码.这种东西是最为流行并且有害的web应用的问题 ...
- 6.linux 用户和权限的建立
一.用户和权限的建立 su 用户名 切换用户,如果是root用户切换其他用户,不需要输入密码. exit 可以切换回上一个用户 linux 操作系统用户 ...
- 程序中的.htaccess文件是做什么的
程序中的.htaccess文件是做什么的 一.总结 一句话总结: htaccess=ht(Hypertext)+access=超文本入口 覆盖Apache服务器的默认配置 .htaccess(超文本访 ...