$a = [1, 3, 5, 2, 4, 6, 12, 60, 45, 10, 32];
$len = count($a);
$num=0; /*
* 冒泡排序
* 原理:不停的对相邻两个数进行比较,直到最大的数冒出来,重复该过程
*
*/
for ($i = 0; $i < $len-1; $i++) {
for ($j=0;$j<$len-1;$j++){
if($a[$j] <$a[$j+1] ){
$temp=$a[$j];
$a[$j]=$a[$j+1];
$a[$j+1]=$temp; }
}
} /*
* 直接插入排序
* 原理:当前插入位置之前的元素有序
* 若插入当前位置的元素比有序元素最后一个元素大,则什么也不做
* 否则在有序序列中找到插入的位置,并插入
*
*/
for($i=0;$i<$len-1;$i++){
if ($a[$i]>$a[$i+1]){
for ($j=$i;$j>=0;$j--){
if($a[$j]>$a[$j+1]){
$temp=$a[$j+1];
$a[$j+1]=$a[$j];
$a[$j]=$temp;
$num++;
}else{
break;
}
}
}
} /*
* 简单选择排序
* 原理:从数组第一个元素开始依次确定从小到大的元素
*/
for ($i=0;$i<$len-1;$i++){
$k=$i;
for($j=$i+1;$j<$len;$j++){
if($a[$k] > $a[$j] ){
$k=$j;
}
}
if ($k!= $i){
$temp=$a[$k];
$a[$k]=$a[$i];
$a[$i]=$temp;
}
} /*
* 希尔排序
* 原理:将数组按指定步长分隔成若干子序列,然后分别对子序列进行排序(在这是直接)
*/
$k = floor($len / 2); while ($k>0) {
for ($i = 0; $i < $k; $i++) {
for ($j = $i; $j < $len && $j + $k < $len; $j = $j + $k) {
if ($a[$j] > $a[$j + $k]) {
$temp = $a[$j + $k];
$a[$j + $k] = $a[$j];
$a[$j] = $temp;
}
$num++;
}
$k=floor($k/2);
}
} //快速排序和归并排序的整体思想是先拆分在合并 /*
* 快速排序
* 原理:通过一趟排序将待排的记录分为两个独立的部分,其中一部分的记录的关键字均不大于
* 另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序,具体做法需要
* 每趟排序设置一个标准关键字和分别指向头一个记录的关键字和最后一个记录的关键字的指针。
*
*/ function quickSort2($array){
if (!isset($array[1]))
return $array;
$mid=$array[0];
$leftArray=[];
$rightArray=[];
foreach ($array as $k=>$v){
if($v>=$mid && $k!=0 ){
$rightArray[]=$v;
}
if($v<$mid){
$leftArray[]=$v;
}
}
$leftArray=quickSort2($leftArray);
$leftArray[]=$mid;
$rightArray=quickSort2($rightArray);
return array_merge($leftArray,$rightArray);
} /*
* 归并排序
* 原理:将数组拆分成两个独立的部分,然后在对独立的部分进行归并排序,它和快速排序的区别在于儿子的左边和儿子
* 的右边进行比较,然后合并成父left或父right
*/
function mergeSort($array){
$k=floor(count($array)/2);
if (!isset($array[1]))
return $array;
$leftArray=mergeSort(array_slice($array,0,$k));
$rightArray=mergeSort(array_slice($array,$k)); while (count($leftArray) && count($rightArray) ){
$m[]= ($leftArray[0] > $rightArray[0]) ? array_shift($rightArray) : array_shift($leftArray);
} return array_merge($m,$leftArray,$rightArray);
}

PHP常见排序算法的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  4. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  5. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  6. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  7. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  8. 常见排序算法总结 -- java实现

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

  9. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  10. [算法] 常见排序算法总结(C语言版)

    常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...

随机推荐

  1. Mac上使用jenkins+ant执行第一个程序

    本文旨在让同学们明白如何让jenkis在mac笔记本上运行,以模拟实际工作中在linux上搭建jenkins服务平台首先按照笔者的习惯先说一下如何安装jenkis和tomcat,先安装tomcat,在 ...

  2. VM及centOS系统安装

    虚拟机安装linux及配置

  3. CucumberJS 资源

    https://cucumber.io/docs/reference/javascript https://github.com/cucumber/cucumber-js

  4. 写了个批量查询qs的软件

    因为需要,自己写了个批量查询qs的小软件.从网站中抓出需要的数据,格式化显示: 对字符串进行检测处理,先用Replace函数去掉字符串的空格,再用正则表达式匹配,返回匹配的字符串,如果没有匹配,则返回 ...

  5. 自然语言处理中的自注意力机制(Self-attention Mechanism)

    自然语言处理中的自注意力机制(Self-attention Mechanism) 近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中,之前我对早期注意力 ...

  6. Java安装和环境变量配置

    一.Java的安装 1.下载合适的版本,安装jdk和jre到同一路径下的同一文件夹下,例如:都安装在 E:\Java: 备注:  JDK:Java Development Kit :  JRE: Ja ...

  7. js中==和===区别

    简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...

  8. Java值传递和引用传递

    Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...

  9. CentOS 6.5 通过命令行安装发送邮件

    1.安装sendmail: yum install sendmail 2.安装mailx: yum install mailx -y 3.编辑发送的配置文件: vi /etc/mail.rc #在最后 ...

  10. unittest自动化使用HTMLTestRunner的中文编码问题

    1.使用unittest自动化测试框架,使用HTMLTestRunner生成测试报告,中文乱码问题! 如图 2.解决方法: 第一步:先在自己的测试脚本中添加 import sys reload(sys ...