PHP常见排序算法
$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常见排序算法的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- JS常见排序算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript版几种常见排序算法
今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- python——常见排序算法解析
算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- [算法] 常见排序算法总结(C语言版)
常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...
随机推荐
- 完全卸载hadoop安装的组件(hdp版本)
yum remove -y hadoop_* zookeeper* ranger* hbase_* ranger* hbase_* ambari-* hadoop_* zookeeper_* hbas ...
- WebService就是这么简单
WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做????? 天气预报这么 ...
- Activity 与 springMvc相整合
准备环境: springMvc框架及Activity所需要的jar: 创建spring-activity.xml文件,里面内容: <?xml version="1.0" en ...
- Javascript的那些硬骨头:作用域、回调、闭包、异步……
终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义, ...
- Nagios详解(基础、安装、配置文件解析及监控实例)
一.Nagios基础 1.简介Nagios是一款开源网络监视工具.可监控网络服务(SMTP.POP3.HTTP.NNTP.ICMP.SNMP.FTP.SSH.PING---).监控主机资源.根据需求设 ...
- numpy pandas 索引注意事项
pandas.DataFrame 的 iloc # ------------------------------------------------------------ 'python式的切片,包 ...
- ArrayList源码解析(JDK1.8)
package java.util; import sun.misc.SharedSecrets; import java.util.function.Consumer; import java.ut ...
- JAVA基础之序列化与反序列化
序列化和反序列化: 把对象转化为字节序列的过程称为序列化: 把字节序列恢复为对象的过程称为对象的反序列化: 方法: Java.io.ObjectOutputStream代表对象的输出流,writeOb ...
- (floyd)佛洛伊德算法
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- Know your weapons Ⅱ
本次内容主要讲述使用UWP相关技术可以实现的软件上的一些功能,这里以Netease-Cloud Music(下称Cloud Music)为例讲述,这款音乐软件我个人一直在用,毕竟人们生活离不开音乐,说 ...