由于最近在找工作,面试中难免会遇到一些算法题,所以就用PHP把七大排序算法都实现了一遍,也当做是一种复习于沉淀。

  1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 希尔排序 6. 归并排序 7. 堆排序(较麻烦)
/**
* 冒泡排序
*/
function bubble($arr) {
$length = count($arr);
for ($i=1; $i<$length; ++$i) {
for ($j=0; $j < $length-$i; ++$j) {
if ($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
/**
* 选择排序
*/
function select($arr) {
$length = count($arr);
for ($i=0; $i<$length-1; ++$i) {
$minIndex = $i;
for ($j=$i+1; $j<$length; ++$j) {
if ($arr[$j] < $arr[$minIndex]) {
$minIndex = $j;
}
}
if ($minIndex != $i) {
$tmp = $arr[$minIndex];
$arr[$minIndex] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
/**
* 插入排序
*/
function insert($arr) {
$length = count($arr);
for ($i=1; $i<$length; ++$i) {
$tmp = $arr[$i];
for ($j=$i-1; $j>=0; --$j) {
if ($tmp < $arr[$j]) {
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
break;
}
}
} return $arr;
}
/**
* 快速排序
*/
function fast($arr) {
$length = count($arr);
if ($length < 1) {
return [];
}
$mid = $arr[0];
$left = [];
$right = []; for ($i=1; $i<$length; ++$i) {
if ($arr[$i] < $mid) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
} $sortLeft = fast($left);
$sortRight = fast($right); return array_merge($sortLeft, [$mid], $sortRight);
}
/**
* 归并排序
*/
function merge($arr) {
$length = count($arr); if ($length < 2) {
return $arr;
} $left = [];
$right = [];
for ($i=0; $i<$length; ++$i) {
if ($i < $length/2) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
} $left = merge($left);
$right = merge($right); $merge = [];
while (count($left) > 0 && count($right) >0) {
if ($left[0] < $right[0]) {
$merge[] = array_shift($left);
} else {
$merge[] = array_shift($right);
}
} if (count($left) > 0) {
$merge = array_merge($merge, $left);
} elseif (count($right) > 0) {
$merge = array_merge($merge, $right);
} return $merge;
}
/**
* 希尔排序
*/
function shell($arr) {
$length = count($arr);
for ($gap = floor($length/2); $gap >0; $gap = floor($gap/2)) {
for ($i=$gap; $i<$length; $i += $gap) {
$tmp = $arr[$i];
for ($j=$i-$gap; $j>=0; $j -= $gap) {
if ($tmp < $arr[$j]) {
$arr[$j+$gap] = $arr[$j];
$arr[$j] = $tmp;
} else {
break;
}
}
}
echo $gap."\n";
} return $arr;
}
/**
* 堆排序
*/
function heap($arr) {
$length = count($arr);
for ($i=floor($length/2)-1; $i>=0; --$i) {
$arr = adjustHeap($arr, $i, $length);
} for ($i=$length-1; $i>=0; --$i) {
$tmp = $arr[0];
$arr[0] = $arr[$i];
$arr[$i] = $tmp; $arr = adjustHeap($arr, 0, $i);
}
return $arr;
} function adjustHeap($arr, $index, $length) {
$lchild = 2*$index+1;
$rchild = 2*$index+2;
$max = $index;
if ($index<=floor($length/2)-1) {
if ($lchild<$length && $arr[$lchild] > $arr[$max]) {
$max = $lchild;
}
if ($rchild<$length && $arr[$rchild] > $arr[$max]) {
$max = $rchild;
}
if ($max != $index) {
$tmp = $arr[$index];
$arr[$index] = $arr[$max];
$arr[$max] = $tmp; $arr = adjustHeap($arr, $max, $length);
}
} return $arr;
}

排序算法:七大排序算法的PHP实现的更多相关文章

  1. (转)白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇

    在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载.下载地址为:http://download.cs ...

  2. 常见的七大排序算法Java实现

    /** * @author Javen * @Email javenlife@126.com * 2015年12月9日 */ public class Sorting { static int[] a ...

  3. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  4. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  5. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  6. javascript数据结构与算法--基本排序算法分析

    javascript中的基本排序算法 对计算机中存储的数据执行的两种最常见操作是排序和检索,排序和检索算法对于前端开发尤其重要,对此我会对这两种算法做深入的研究,而不会和书上一样只是会贴代码而已,下面 ...

  7. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  8. 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)

    前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...

  9. Stooge排序与Bogo排序算法

    本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址. Stooge排序算法 Stooge ...

随机推荐

  1. maven 环境搭建 Myeclipse配置

    一:Maven的下载安装 准备工作: 1)安装环境 Windows xp 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.e ...

  2. JavaWeb项目开发案例精粹-第3章在线考试系统-007View层

    0.login.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...

  3. PowerDesigner连接Oracle数据库建表序列号实现自动增长

    原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...

  4. Android ListView高度自适应和ScrollView冲突解决

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...

  5. myeclipse快速开发配置

    1,打开MyEclipse 2013然后“window”→“Preferences” 2. 选择“java”,展开,“Editor”,选择“Content Assist”. 3. 选择“Content ...

  6. dex

    数字交叉连接设备(Dendenkosha Electronic Exchange),就是常说的电子交换器.   数字交叉连接设备完成的主要是STM-N信号的交叉连接功能,它是一个多端口器件,它实际上相 ...

  7. openfire中mysql的前期设置

    使用openfire的时候如果需要使用自己的mysql数据库,需要提前进行设置,下面将记录下,基本的设置过程. 一.前期准备工作: 1.先下载两个工具一个是mysql数据库还有一个是SQLyog(可以 ...

  8. Enabling HierarchyViewer on Rooted Android Devices

    转自http://blog.apkudo.com/2012/07/26/enabling-hierarchyviewer-on-rooted-android-devices/. The Hierarc ...

  9. 第六届华为创新杯编程大赛-进阶1第1轮 洞穴逃生 (bfs + 优先队列)

    这个题容易出错想了挺长时间,然后代码不长,1Y.. 做完题,看了一下别人的博客,也可以优先用 闪烁法术, 在闪烁法术不不如跑步的阶段(即魔法恢复的时候)用跑步. 洞穴逃生 描述: 精灵王子爱好冒险,在 ...

  10. HttpContext.Current.RewritePath方法重写URL

    if (!IsPostBack) { //如果请求ID为空,则重写URL为:~/index.aspx?ID=shouji.115sou.com if (Request.QueryString[&quo ...