<?php
/**
* PHP最常用的四个排序方法及二种查找方法
* 下面的排序方法全部都通过测试
* auther : soulence
* date : 2015/06/20
*/ //PHP冒泡排序法
function bubbleSort(&$arr){
//这是一个中间变量
$temp=0;
//我们要把数组,从小到大排序
//外层循环
$flag=false;//这个优化之后效率会很高,一般够用
for($i=0;$i<count($arr)-1;$i++){ for($j=0;$j<count($arr)-1-$i;$j++){
//说明前面的数比后面的数大,就要交换
if($arr[$j]>$arr[$j+1]){
$temp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
$flag=true;
}
}
if(!$flag){
//已经是有序了
break;
}
$flag=false;
}
} //PHP选择排序法 效率比冒泡要高
function selectSort(&$arr){
$temp=0;
for($i=0;$i<count($arr)-1;$i++){
//假设$i就是最小的数
$minVal=$arr[$i];
//记录我认为的最小数的下标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++){
//说明我们认为的最小值,不是最小
if($minVal>$arr[$j]){
$minVal=$arr[$j];
$minIndex=$j;
}
}
//最后交换
$temp=$arr[$i];
$arr[$i]=$arr[$minIndex];
$arr[$minIndex]=$temp;
}
} //插入排序法(小到大排序) 效率又比 选择排序法要高一些
function insertSort(&$arr){
//先默认下标为0的这个数已经是有序
for($i=1;$i<count($arr);$i++){
//$insertVal是准备插入的数
$insertVal=$arr[$i];
//准备先和谁下标为$inserIndex的比较
$inserIndex=$i-1;
//如果这个条件满足,说明我们还没有找到适当的位置
while($inserIndex >= 0 && $insertVal < $arr[$inserIndex]){
//同时把数后移
$arr[$inserIndex+1] = $arr[$inserIndex];
$inserIndex--;
}
//插入(这时就给$inserIndex找到适当的位置)
$arr[$inserIndex+1] = $insertVal;
}
} //快速排序法 第一种写法 不是我实现的
function quickSort($left,$right,&$arr){
$l=$left;
$r=$right;
$pivot= $arr[($left+$right)/2];
while($l<$r){
while($arr[$l]<$pivot){
$l++;
}
while($arr[$r]>$pivot){
$r--;
}
if($l>=$r){
break;
} $temp=$arr[$l];
$arr[$l]=$arr[$r];
$arr[$r]=$temp;
if($arr[$l]==$pivot){
--$r;
}
if($arr[$r]==$pivot){
++$l;
}
}
if($l==$r){
$l++;
$r--;
}
if($left<$r) quickSort($left,$r,$arr);
if($right>$l) quickSort($l,$right,$arr);
} /**
* 快速排序方法 第二种实现方法 自己实现的
* PHP快速排序方法
* $order asc 小到大 desc大到小 默认是asc
* $order 的值只能为 asc desc 如果乱写一个值也是按asc排序的
*/
function quickSort2($arr,$order = 'asc')
{
if(count($arr) <= 1)
return $arr; $arr_left = $arr_right = array(); $val = $arr[0];unset($arr[0]); foreach ($arr as $v) {
if(strtolower($order) == 'desc'){
if($v < $val)
$arr_right[] = $v;
else
$arr_left[] = $v;
}else{
if($v > $val)
$arr_right[] = $v;
else
$arr_left[] = $v;
}
} $arr_left = quickSort($arr_left,$order);
$arr_right = quickSort($arr_right,$order); return array_merge($arr_left,array($val),$arr_right);
} //下面是查找
$arr=array(46,90,900,0,-1);
//这是按顺序查询
function search(&$arr,$findVal){
$flag=false;
for($i=0;$i<count($arr);$i++){
if($findVal==$arr[$i]){
echo "找到了,下标为=$i";
$flag=true;
//查询一次,如果多次就不要这个 break;
}
}
if(!$flag){
echo "查无此数";
}
} //调用二分查找
$arr=array(0,90,900,99990);//注意,一定要是有序的
binarySwarch($arr,90,0,count($arr)-1); //二分查找函数,它有一个前提,查找的数组必须是有序的
function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
//如果$rightIndex < $leftIndex条件成立,说明没有这个数,则退出
if($rightIndex < $leftIndex){
echo "找不到该数";
return;
}
//首先找到中间这个数 round是出于如果出现小数,四舍五入
$middleIndex=round(($rightIndex+$leftIndex)/2);
//如果大于则向后面找
if($findVal > $arr[$middleIndex]){
binarySearch($arr,$findVal,$middleIndex+1,$rightIndex);
//如果小于中间数,则向前面找
}else if($findVal < $arr[$middleIndex]){
binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
}else{
echo "找到这个数。下标是$middleIndex";
}
} ?>

PHP的几种排序方法的更多相关文章

  1. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  2. AJPFX关于Java中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...

  3. ch1_6_1求解两种排序方法问题

    考拉有n个字符串字符串,任意两个字符串长度都是不同的.  考拉最近学习到有两种字符串的排序方法:   1.根据字符串的字典序排序.例如: "car" < "carr ...

  4. python 两种排序方法 sort() sorted()

    python中有两种排序方法,list内置sort()方法或者python内置的全局sorted()方法 区别为: sort()方法对list排序会修改list本身,不会返回新list.sort()只 ...

  5. c#实现几种排序方法

    插入排序 1.简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序 ...

  6. JAVA中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...

  7. CList 点击表头排序 (2)两种排序方法中其中一种

    上一篇讲解SortItem()方法如何使用,虽然都是抄别人的但是就是想让大家有个大概的了解 CList 点击表头排序 (1)SortItems函数 点击表头排序基本思路都是 1.首先响应HDN_ITE ...

  8. JAVA 中数组的几种排序方法

    1.数组的冒泡排序   public void bubbleSort(int a[]) {      int n = a.length;      for (int i = 0; i < n - ...

  9. js 几种排序方法

    1.冒泡排序 var arr = [9, 7, 5, 3, 1]; for (var i = 0; i < arr.length - 1; i++) { for (var j = 0; j &l ...

随机推荐

  1. python学习之split()

    定义: Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 语法: str.split(str="", num=st ...

  2. Linux之手动设置IP地址

    一.引言 有时候我们装好了机器却发现网络没有设置,而服务器的机器一般都是没有界面的,那么该如何设置IP呢? 二.步骤 root用户,#vi /etc/sysconfig/network-scripts ...

  3. Makefile 13——理解make的解析行为

    make是以从上到下的顺序读入Makefile中的内容的.然而,处理Makefile中的语句却并非完全从上到下. 大体上,make处理一个Makefile分为两个阶段.第一个阶段包含: 1.make读 ...

  4. HDU 1075 What Are You Talking About (Trie)

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  5. 内核补丁 patch

    https://www.kernel.org/diff/diffview.cgi?file=/pub/linux/kernel/v3.x/patch-3.18.12.xz

  6. 截图工具gsnap

    嵌入式linux截图工具的基本原理就是通过读取Framebuffer,把LCD上显示的内容转换成图片格式文件(jpeg.bmp.png). gsnap.bin 1.jpg  /dev/fb0 gsna ...

  7. [转]Tomcat和Apache的区别和联系

    Apache,指的是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx同样也是一款开源的HTTP服务器软件(当然它也可以作为邮件代理服务器.通用的T ...

  8. logback参考配置

    logback配置 <?xml version="1.0" encoding="UTF-8"?> <configuration> < ...

  9. 成功抓取douban 所有电影

    之前爬了250,想爬所有的电影 Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+')), callback=" ...

  10. php ajax dom---动态增加

    js代码 <script type="text/javascript"> $(document).ready(function(){ $("#talk_sen ...