由于最近在找工作,面试中难免会遇到一些算法题,所以就用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. lintcode:next permutation下一个排列

    题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] ...

  2. Intellij IDEA调试功能

    public class Demo { public static void f1() { System.out.println("one"); System.out.printl ...

  3. 在C#中实现Python的分片技术

    在C#中实现Python的分片技术 前言 之前在学习Python的时候发现Python中的分片技术超好玩的,本人也是正则表达式热爱狂,平时用C#比较多,所以决定把Python中的分片技术在C#中实现, ...

  4. 初学者的checklist:对于QTP,你应该知道的9个基本概念

    学习QTP或者其他相关任何工具的方法都是首先把基本的概念过一遍.正所谓砍柴不怕磨刀功,一旦你对这些概念熟悉了,你就可以学习该工具的高级部分了.写这篇文章的目标是列出初学QTP的人应该掌握的所有基本概念 ...

  5. VS2015中的异常配置

    The New Exception Settings Window in Visual Studio 2015Managing Exceptions with the Debugger Underst ...

  6. [UESTC1059]秋实大哥与小朋友(线段树, 离散化)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...

  7. svn is already under version control问题解决

    svn ci 时出现 xx is already under version control,然后无法提交,出现这个问题的原因是你所提交的文件或目录是其他SVN的东西,即下面有.svn的目录,需要先把 ...

  8. Nlog Layout

    Nlog.config <targets>     <target type="Console" name="trace" layout=&q ...

  9. UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!

    题意: 斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0) 输入a.b.n,求f(ab)%n 分析: 构造一个新数列F(i) = f(i) ...

  10. Codeforces Round #269 (Div. 2)

    A 题意:给出6根木棍,如果有4根相同,2根不同,则构成“bear”,如果剩余两个相同,则构成“elephant” 用一个数组分别储存各个数字出现的次数,再判断即可 注意hash[i]==5的时候,也 ...