排序算法,以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 ...
随机推荐
- MySQL(调优慢查询、explain profile) 转
转自http://www.linuxidc.com/Linux/2012-09/70459.htm mysql profile explain slow_query_log分析优化查询 在做性能测试中 ...
- 51nod 1190 最小公倍数之和 V2【莫比乌斯反演】
参考:http://blog.csdn.net/u014610830/article/details/49493279 这道题做起来感觉非常奇怪啊--头一次见把mu推出来再推没了的-- \[ \sum ...
- Linux的远程桌面配置
一.Ubuntu的远程桌面 Ubuntu默认已安装好VNC服务端组件vino-server,只需要在“系统设置->首选项->桌面共享”中设置即可. 1.设置桌面共享首选项 2.设置好之后, ...
- [TJOI2013]松鼠聚会
Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短 ...
- MFC显示文本文档 分类: MFC 2014-12-30 10:03 457人阅读 评论(1) 收藏
新建基于对话框的MFC应用程序.资源视图的对话框上添加编辑框(Edit Control)和按钮(Button), 将编辑框属性:Mutiline.Auto HScroll.Auto VScroll设为 ...
- 随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比. 程序用一次遍历,实现带权随机选取. 算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+... ...
- 423 Reconstruct Original Digits from English 从英文中重建数字
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9.按升序输出原始的数字.注意: 输入只包含小写英文字母. 输入保证合法并可以转换为原始的数字,这意味着像 "ab ...
- (六)Mybatis总结之延迟加载
应用场景: i.假如一个用户他有N个订单(N>=1000),那么如果一次性加载的话,一个用户对象的订单集合OrderList里面就会有1000多个Order的对象.计算:一个订单对象里面数据有多 ...
- 2017团体程序设计天梯赛大区赛 L3-3 球队“食物链”
思路: 状压dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...
- fullpagejs实现的拥有header和foooter的全屏滚动demo/fullpage footer
fullpagejs实现的拥有header和foooter的全屏滚动, 技术要点:给section元素加fp-auto-height类, <!DOCTYPE html> <html ...