一、冒泡排序

<?php
/**
* Created by PhpStorm.
* User: 郑楚周
* Date: 2018/9/28
* Time: 16:10
*/ /**冒泡排序
* Class Bubble
*/
class Bubble implements sort
{
/**冒泡排序
* @param $arr
*/
public function sort($arr)
{
$count = count($arr);
if($count <= 0) return '不能为空数组'; for($i = ($count - 2); $i >= 0; $i--) {
for ($j = 0; $j <= $i; $j++) {
if($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
} 二、选择排序
<?php
/**
* Created by PhpStorm.
* User: 郑楚周
* Date: 2018/9/28
* Time: 16:10
*/ /**选择排序
* Class Select
*/
class Select implements sort
{
public function sort($arr)
{
$count = count($arr);
for ($i = 0; $i < $count; $i++) {
$minIndex = $i;
for ($j = $i + 1; $j < $count; $j++) {
if ($arr[$minIndex] > $arr[$j]) {
$minIndex = $j;
}
}
helper::swap($arr[$i], $arr[$minIndex]);
}
return $arr;
}
}
三、插入排序
<?php
/**
* Created by PhpStorm.
* User: 郑楚周
* Date: 2018/10/5
* Time: 16:43
*/ /**插入排序
* Class Insert
*/
class Insert implements sort
{
/**版本1
* @param $arr
* @return mixed
*/
/* public function sort($arr)
{
$count = count($arr);
for ($i = 1; $i < $count; $i++) {
for ($j = $i; $j > 0 && $arr[$j] < $arr[$j - 1]; $j--) {
helper::swap($arr[$j], $arr[$j - 1]);
}
}
return $arr;
}*/ /**版本2
* @param $arr
* @return mixed
*/
public function sort($arr)
{
$count = count($arr);
for ($i = 1; $i < $count; $i++) {
$tmp = $arr[$i];
for ($j = $i; $j > 0 && $tmp < $arr[$j - 1]; $j--) {
$arr[$j] = $arr[$j - 1];
}
$arr[$j] = $tmp;
}
return $arr;
}
}
四、归并排序
<?php
/**
* Created by PhpStorm.
* User: 郑楚周
* Date: 2018/10/5
* Time: 19:26
*/ /**归并排序
* Class Merge
*/
class Merge implements sort
{
/**自上向下归并排序
* @param $arr
*/
public function sort($arr)
{
$this->__mergeSort($arr, 0, count($arr) - 1);
return $arr;
} /**自下向上归并排序
* @param $arr
*/
public function sortBu($arr)
{
$count = count($arr);
for ($sz = 1; $sz <= $count; $sz += $sz) {
for ($i = 0; $i < $count - $sz; $i += 2*$sz) {
$this->__merge($arr, $i, $i + $sz - 1, helper::min($i + 2*$sz - 1, $count - 1));
}
}
return $arr;
} private function __mergeSort(&$arr, $left, $right)
{
if ($left >= $right) {
return;
}
$mid = floor(($left + $right)/2);
$this->__mergeSort($arr, $left, $mid);
$this->__mergeSort($arr, $mid + 1, $right);
if ($arr[$mid] > $arr[$mid + 1])
$this->__merge($arr, $left, $mid, $right);
} /**将$arr[$left]~$arr[$mid]和$arr[$mid + 1]~$arr[$right]两部分进行归并
* @param $arr
* @param $left
* @param $mid
* @param $right
*/
private function __merge(&$arr, $left, $mid, $right)
{
    $tmpArr = $arr;
    for ($k = $left, $i = $left, $j = $mid + 1; $k <= $right; $k++) {
    if ($i > $mid) {
    $arr[$k] = $tmpArr[$j++];
    } elseif ($j > $right) {
    $arr[$k] = $tmpArr[$i++];
    } elseif ($tmpArr[$i] < $tmpArr[$j]) {
    $arr[$k] = $tmpArr[$i++];
    } else { // $tmpArr[$i] >= $tmpArr[$j]
    $arr[$k] = $tmpArr[$j++];
    }
    }
    }
}
五、快速排序
<?php
/**
* Created by PhpStorm.
* User: 郑楚周
* Date: 2018/10/6
* Time: 11:02
*/
class Quick implements sort
{
/**
* @param $arr
* @return mixed
*/
public function sort($arr)
{
$this->__quick($arr, 0, count($arr) - 1);
return $arr;
} /**
* @param $arr
* @param $l
* @param $r
*/
private function __quick(&$arr, $l, $r)
{
if ($l >= $r)
return; $p = $this->__partition($arr, $l, $r);
$this->__quick($arr, $l, $p);
$this->__quick($arr, $p + 1, $r);
} /**遍历$l+1到$r,每个值和$l的值比较,将数值小的放在数组左侧,大的放在右侧,最后在将$l对应的值和$j对应的值交换位置
* @param $arr
* @param $l
* @param $r
* @return mixed
*/
private function __partition(&$arr, $l, $r)
{
$v = $arr[$l];
$j = $l;
for ($i = $l + 1; $i <= $r; $i++) {
if ($arr[$i] < $v)
helper::swap($arr[$i], $arr[++$j]);
}
helper::swap($arr[$l], $arr[$j]);
return $j;
}
} 六、排序效率对比如下

												

排序算法,以php为代码示例的更多相关文章

  1. 第二章:排序算法 及其他 Java代码实现

    目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...

  2. 动画展现十大经典排序算法(附Java代码)

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  3. 常见排序算法原理及JS代码实现

    目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...

  4. PCA 降维算法详解 以及代码示例

    转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analys ...

  5. 八大排序算法JS及PHP代码实现

    从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以 ...

  6. js学习笔记之排序算法的原理及代码

    冒泡排序 比较任何两个相邻的项,如果第一个比第二个大,则交换它们 重复这样的操作,直到排序完成,具体代码如下: let arr = [67,23,11,89,45,76,56,99] function ...

  7. 最全排序算法原理解析、java代码实现以及总结归纳

    算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过 ...

  8. [Data Structure & Algorithm] 八大排序算法

    排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...

  9. Java学习笔记——排序算法之快速排序

    会当凌绝顶,一览众山小. --望岳 如果说有哪个排序算法不能不会,那就是快速排序(Quick Sort)了 快速排序简单而高效,是最适合学习的进阶排序算法. 直接上代码: public class Q ...

  10. Java实现基本排序算法

    稳定排序算法性能比较 冒泡排序代码: /** * 冒泡排序 * * @param arr * @return */ public int[] bubbleSort(int[] arr) { int t ...

随机推荐

  1. Ubuntu 14.04 配置 Java SE jdk-7u55 (转载)

    转自:http://blog.csdn.net/tecn14/article/details/24797545 JDK  目前最新版为jdk-8u5,这次没有选择安装最新的jdk8,而是要安装jdk7 ...

  2. Linux 常用命令七 grep

    一.grep命令 grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜 ...

  3. bzoj 1068: [SCOI2007]压缩【区间dp】

    神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...

  4. ibatais.net 连接 mysql 最全配置写法

    1.安装环境: 1.       vs2013 (vs开发工具) 2.       mysql 5.7.10.0 (安装的mysql 数据库版本) https://dev.mysql.com/doc/ ...

  5. Oracle异机恢复

    RMAN异机恢复注意事项:1.RMAN 异机恢复的时候,db_name必须相同. 如果说要想改成其他的实例名,可以在恢复成功后,用nid 命令修改. 实例名的信息会记录到控制文件里,所以如果在恢复的时 ...

  6. A - Supercentral Point CodeForces - 165A

    One day Vasya painted a Cartesian coordinate system on a piece of paper and marked some set of point ...

  7. Python之Linux下的virtualenv&&virtualenvwrapper

    virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境. #指定清华源下载pip的包 pip3 install -i https://pypi.tuna.tsinghua.edu.cn ...

  8. SpringCloud开发学习总结(五)—— 服务容错保护Hystrix

    在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式相互依赖.但由于每个单元都在不同的进程中运行,一来通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身 ...

  9. 017:COM1无法打开

    重新安装系统以后,COM1无法正常打开,重启以后也是如此.到设备管理器下,禁用COM1然后重启可以正常使用.修改COM1为别的COM号,重启以后可以正常使用.用Pcomm控件,打开该串口,错误号是-8 ...

  10. AJPFX关于通过索引获取最大值的思路

    /*** 通过索引获取最大值***/public class Test1 {        public static void main(String[] args) {              ...