PHP的几种排序算法的比较
这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助
/*
* php 四种排序算法的时间与内置的sort排序比较
* 3000个元素,四种算法的排序所用的时间比较
* 冒泡排序 857.98192024231ms
* 选择排序 903.74493598938ms
* 插入排序 296.8270778656ms
* 快速排序 15.607833862305ms
* sort排序 0.95200538635254ms
* 归并排序 14.61386680603ms
* */ /*
* @param 冒泡排序
* 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
* 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
* */
function BubbleSort($arr) {
$len = count($arr);
//设置一个空数组 用来接收冒出来的泡
//该层循环控制 需要冒泡的轮数
for ($i = ; $i < $len; $i++) {
$flag = false; //本趟排序开始前,交换标志应为假
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for ($k = ; $k < $len - $i; $k++) {
//从小到大排序
if ($arr[$k] > $arr[$k + ]) {
$tmp = $arr[$k + ];
$arr[$k + ] = $arr[$k];
$arr[$k] = $tmp;
$flag = true;
}
}
if(!$flag) return $arr;
}
} /*
* @param 选择排序法
* 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
* 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
* */
function selectSort($array){
$temp = ;
for($i = ;$i < count($array) - ;$i++){
$minVal = $array[$i]; //假设$i就是最小值
$minValIndex = $i;
for($j = $i+;$j < count($array);$j++){
if($minVal > $array[$j]){ //从小到大排列
$minVal = $array[$j]; //找最小值
$minValIndex = $j;
}
}
$temp = $array[$i];
$array[$i] = $array[$minValIndex];
$array[$minValIndex] = $temp;
}
} /*
* 插入排序法
* 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
* 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
* */
function insertSort($array){ //从小到大排列
//先默认$array[0],已经有序,是有序表
for($i = ;$i < count($array);$i++){
$insertVal = $array[$i]; //$insertVal是准备插入的数
$insertIndex = $i - ; //有序表中准备比较的数的下标
while($insertIndex >= && $insertVal < $array[$insertIndex]){
$array[$insertIndex + ] = $array[$insertIndex]; //将数组往后挪
$insertIndex--; //将下标往前挪,准备与前一个进行比较
}
if($insertIndex + !== $i){
$array[$insertIndex + ] = $insertVal;
}
}
} /*
* 快速排序法
* 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
* */
function quickSort($array){
if(!isset($array[])) return $array;
$mid = $array[]; //获取一个用于分割的关键字,一般是首个元素
$leftArray = array();
$rightArray = array();
foreach($array as $v){
if($v > $mid)
$rightArray[] = $v; //把比$mid大的数放到一个数组里
if($v < $mid)
$leftArray[] = $v; //把比$mid小的数放到另一个数组里
}
$leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割
$leftArray[] = $mid; //把分割的元素加到小的数组后面,不能忘了它哦
$rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割
return array_merge($leftArray,$rightArray); //组合两个结果
} /*
* 归并排序
* 归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。
* 这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。
* */
function mergeSort(&$arr) {
$len = count($arr);//求得数组长度
mSort($arr, , $len-);
return $arr;
}
//实际实现归并排序的程序
function mSort(&$arr, $left, $right) {
if($left < $right) {
//说明子序列内存在多余1个的元素,那么需要拆分,分别排序,合并
//计算拆分的位置,长度/2 去整
$center = floor(($left+$right) / );
//递归调用对左边进行再次排序:
mSort($arr, $left, $center);
//递归调用对右边进行再次排序
mSort($arr, $center+, $right);
//合并排序结果
mergeArray($arr, $left, $center, $right);
}
}
//将两个有序数组合并成一个有序数组
function mergeArray(&$arr, $left, $center, $right) {
//设置两个起始位置标记
$a_i = $left;
$b_i = $center+;
while($a_i<=$center && $b_i<=$right) {
//当数组A和数组B都没有越界时
if($arr[$a_i] < $arr[$b_i]) {
$temp[] = $arr[$a_i++];
} else {
$temp[] = $arr[$b_i++];
}
}
//判断 数组A内的元素是否都用完了,没有的话将其全部插入到C数组内:
while($a_i <= $center) {
$temp[] = $arr[$a_i++];
}
//判断 数组B内的元素是否都用完了,没有的话将其全部插入到C数组内:
while($b_i <= $right) {
$temp[] = $arr[$b_i++];
} //将$arrC内排序好的部分,写入到$arr内:
for($i=, $len=count($temp); $i<$len; $i++) {
$arr[$left+$i] = $temp[$i];
}
} $a = array_rand(range(,), ); //生成3000个元素的随机数组
shuffle($a); //打乱数组的顺序
$t1 = microtime(true);
BubbleSort($a); //冒泡排序
$t2 = microtime(true);
echo "冒泡排序用时:".(($t2-$t1)*).'ms'."\n"; $t3 = microtime(true);
selectSort($a); //选择排序
$t4 = microtime(true);
echo "选择排序用时:".(($t4-$t3)*).'ms'."\n"; $t5 = microtime(true);
insertSort($a); //插入排序
$t6 = microtime(true);
echo "插入排序用时:".(($t6-$t5)*).'ms'."\n"; $t7 = microtime(true);
quickSort($a); //快速排序
$t8 = microtime(true);
echo "快速排序用时:".(($t8-$t7)*).'ms'."\n"; $t9 = microtime(true);
sort($a);
$t10 = microtime(true);
echo "sort排序用时:".(($t10-$t9)*)."ms"."\n"; $t11 = microtime(true);
mergeSort($a);
$t12 = microtime(true);
echo "归并排序用时:".(($t12-$t11)*)."ms";
从时间上来看,快速排序和归并排序在时间上比较有优势,但是也比不上sort排序,归并排序比较占用内存!
PHP的几种排序算法的比较的更多相关文章
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- 秒杀9种排序算法(JavaScript版)
一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...
- 学习Java绝对要懂的,Java编程中最常用的几种排序算法!
今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来! ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...
- C#常用8种排序算法实现以及原理简介
public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...
- 排序—时间复杂度为O(n2)的三种排序算法
1 如何评价.分析一个排序算法? 很多语言.数据库都已经封装了关于排序算法的实现代码.所以我们学习排序算法目的更多的不是为了去实现这些代码,而是灵活的应用这些算法和解决更为复杂的问题,所以更重要的是学 ...
- java算法03 - 常用的8种排序算法
Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...
- 用 C 语言描述几种排序算法
排序算法是最基本且重要的一类算法,本文基于 VS2017,使用 C 语言来实现一些基本的排序算法. 一.选择排序 选择排序,先找到数组中最小的元素,然后将这个元素与数组的第一个元素位置互换(如果第一个 ...
- 【C++】四种排序算法的时间比较
四种排序算法的时间比较 [注]clock函数对输入(用户输入)元素N排序的计时 #include<iostream> #include<time.h> using namesp ...
- 几种排序算法及Java实现排序的几种方式
几种排序算法 下面的例子介绍了4种排序方法: 冒泡排序, 选择排序, 插入排序, 快速排序 package date201709.date20170915; public class SortUtil ...
随机推荐
- 初学.net 网页打开过程
一个网页打开的过程 1.进入控制器里的方法里 控制器的命名必须以Controll结尾前面的名字要和view层的命名一致 2.控制器完了以后 就进入view层对应的视图里 3.视图里调用model ...
- JPA 系列教程3-单向多对一
JPA中的@ManyToOne 主要属性 - name(必需): 设定"many"方所包含的"one"方所对应的持久化类的属性名 - column(可选): 设 ...
- CodeForces 719B Anatoly and Cockroaches 思维锻炼题
题目大意:有一排蟑螂,只有r和b两种颜色,你可以交换任意两只蟑螂的位置,或涂改一个蟑螂的颜色,使其变成r和b交互排列的形式.问做少的操作次数. 题目思路:更改后的队列只有两种形式:长度为n以r开头:长 ...
- THOUGHTS: programming in linux... with third_party open sources... methods
Actually I do not have experiences in programming with open sources/third party libs.. in linux.. I ...
- nagios总结二
log_file=/usr/local/nagios/var/nagios.log # 定义nagios日志文件的路径cfg_file=/usr/local/nagi ...
- Android自动化测试之环境搭建
Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...
- linux下环境变量PS1设置
PS1变量中提示符各项含义: \d :代表日期,格式为weekday month date,例如:Wed Dec 12 \H :完整的主机名称.例如:hostname是debian.linux \ ...
- Problem A
Problem A Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- 屏幕的尺寸(厘米)、屏幕分辨率(像素)、PPI它们之间是什么关系
屏幕的尺寸(厘米).屏幕分辨率(像素).PPI它们之间是什么关系? 添加评论 分享 赞同2反对,不会显示你的姓名 知乎用户,数据ETL,UNITY3D 刘大侠.如果 赞同 以iphone4 为例,分辨 ...
- Universal-Image-Loader分析:
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.权限: <uses-permission ...