排序算法,以php为代码示例
一、冒泡排序
<?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为代码示例的更多相关文章
- 第二章:排序算法 及其他 Java代码实现
目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...
- 动画展现十大经典排序算法(附Java代码)
0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...
- 常见排序算法原理及JS代码实现
目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...
- PCA 降维算法详解 以及代码示例
转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analys ...
- 八大排序算法JS及PHP代码实现
从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以 ...
- js学习笔记之排序算法的原理及代码
冒泡排序 比较任何两个相邻的项,如果第一个比第二个大,则交换它们 重复这样的操作,直到排序完成,具体代码如下: let arr = [67,23,11,89,45,76,56,99] function ...
- 最全排序算法原理解析、java代码实现以及总结归纳
算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过 ...
- [Data Structure & Algorithm] 八大排序算法
排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...
- Java学习笔记——排序算法之快速排序
会当凌绝顶,一览众山小. --望岳 如果说有哪个排序算法不能不会,那就是快速排序(Quick Sort)了 快速排序简单而高效,是最适合学习的进阶排序算法. 直接上代码: public class Q ...
- Java实现基本排序算法
稳定排序算法性能比较 冒泡排序代码: /** * 冒泡排序 * * @param arr * @return */ public int[] bubbleSort(int[] arr) { int t ...
随机推荐
- 极简版OKEX比特币跨期对冲策略
策略特点 只做正套,反套可以修改下,合约调换一下,即是反套. 添加两个 交易所对象,第一个季度,第二个当周. 精简了所有能简化的代码,优化空间还很大,教学策略谨慎实盘,跨期有一定风险. 欢迎反馈BUG ...
- .NET Core 跨平台物联网开发:上报属性(三)
系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四) SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...
- SSH的安装及使用
ssh(secure shell--加密远程登录管理服务器) ,是一种安全的传输协议,主要用于给远程登录会话的数据进行加密,保证数据传输的安全.Ubuntu客户端可以通过SSH访问远程服务器.SSH的 ...
- Python variable 作用域和初始化
Python 根据LEGB rule在不同的namespace中找变量 在def的函数中对global 变量做修改还是不推荐的,应该将其作为参数传入函数 try: do_something() cnt ...
- 应用CSS样式表
首先应该分清楚应用CSS样式表到HTML页面中和将css样式表绑定到HTML页面的对象,是两个不同的概念.像之前说的通过不同的选择器将样式表绑定到HTML页面中的对象,但其实使用的都是同一种方法应用c ...
- ASP.NET MVC+Bootstrap个人博客之文章打赏(六)
看到新浪微博.百度百家等等平台上都带有文章“打赏”功能,觉得很新鲜,于是也想在自己的博客中加入“打赏”功能. 当然,加入打赏功能并非是真的想要让别人打赏.因为只有那些真正能引起共鸣,发人深思,让人受益 ...
- html5表单新增元素与属性2
1.标签的control属性 在html5中,可以在标签内部放置一个表单元素,并且通过该标签的control属性来访问该表单元素. <script> function setValue() ...
- Linux 之 2>&1
我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令.首先我们把这条命令大概分解下首先就是一个nohup表示当前用户和系统 ...
- http的请求与响应-----content-type
content-type 指请求消息头的中请求消息数据的格式 有三种用法 第一种:设置在request header的参数中 js中可以在发送请求前在请求消息头中设置content-typevar x ...
- 在JAVA中封装JSONUtils工具类及使用 (转)
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util. ...