php排序代码
① php 字典排序
ksort($arr);
② PHP快速排序算法实现的原理及代码详解
算法原理
下列动图来自五分钟学算法,演示了快速排序算法的原理和步骤。
步骤:
从数组中选个基准值
将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置
递归的对分列两边的数组再排序
代码实现
function
quickSort($arr)
{
$len
=
count($arr);
if
($len
<=
1)
{
return
$arr;
}
$v
=
$arr[0];
$low
=
$up
=
array();
for
($i
=
1;
$i
<
$len;
++$i)
{
if
($arr[$i]
>
$v)
{
$up[]
=
$arr[$i];
}
else
{
$low[]
=
$arr[$i];
}
}
$low
=
quickSort($low);
$up
=
quickSort($up);
return
array_merge($low,
array($v),
$up);
}
测试代码:
$startTime
=
microtime(1);
$arr
=
range(1,
10);
shuffle($arr);
echo
"before
sort:
",
implode(',
',
$arr),
"\n";
$sortArr
=
quickSort($arr);
echo
"after
sort:
",
implode(',
',
$sortArr),
"\n";
echo
"use
time:
",
microtime(1)
-
$startTime,
"s\n";
测试结果:
before
sort:
1,
7,
10,
9,
6,
3,
2,
5,
4,
8
after
sort:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
use
time:
0.0009009838104248s
时间复杂度
快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。
这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。
1)
为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。
2)
为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。
您可能感兴趣的文章:PHP快速排序算法实例分析PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】PHP排序算法之快速排序(Quick
Sort)及其优化算法详解PHP递归实现快速排序的方法示例php
二维数组快速排序算法的实现代码PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort实例详解
③ PHP实现常见的排序算法
注:为方便描述,下面的排序全为正序(从小到大排序)
假设有一个数组[a,b,c,d]
冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变。具体步骤:
1,比较a,b这两个元素,如果a>b,则交换位置,数组变为:[b,a,c,d]
2,比较a,c这两个元素,如果a<c,则位置不变,数组变为:[b,a,c,d]
3,比较c,d这两个元素,如果c>d,则交换位置,数组变为:[b,a,d,c]
完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了。
第二轮比较结束后,第二大的数也会冒到倒数第二的位置。
依次类推,再进行第三轮,,,
就这样最大的数一直往后排(冒),最后完成排序。所以我们称这种排序算法为冒泡排序。
选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面。具体步骤如下:
插入排序步骤大致如下:
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。
步骤:
从数列中挑出一个元素,称为 “基准”(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
④ php数组随机排序几种方法
它的用法也很简单:array_rand($arr[, $num])$arr == 用来取元素的数组$num == 随机取下标的个数其中第二个参数 $num 是可选的,默认为1 。注意:它的返回值在第二个参数大于 1 的时候是一个数组;当第二个参数不设或者传值 1 的时候是一个下标。简单的示例代码如下:1、第二个参数不传值的情况;$arr = Array('a', 'b');$rndKey = array_rand($arr);echo $arr[$rndKey];//输出 a 或者 b2、第二个参数传值大于 1 的情况;$arr = Array('a', 'b', 'c', 'd');$rndKey = array_rand($arr, 2);print_r($rndKey]);//输出一个随机key的数组
⑤ php几种排序算法实例详解
下面给你介绍四种排序方法:
1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。实现代码如下:
⑥ php数组从大到小排序谁帮忙想下感谢
你好,建议使用冒泡排序法,这样看上去比较清楚明了,你这样编写就比较复杂了。
⑦ PHP 怎样按日期排序
php读取文件夹目录里的文件后,可以并按照日期,大小,名称排序。
参考代码如下:
functiondir_size($dir,$url){
$dh=@opendir($dir);//打开目录,返回一个目录流
$return=array();
$i=0;
while($file=@readdir($dh)){//循环读取目录下的文件
if($file!='.'and$file!='..'){
$path=$dir.'/'.$file;//设置目录,用于含有子目录的情况
if(is_dir($path)){
}elseif(is_file($path)){
$filesize[]=round((filesize($path)/1024),2);//获取文件大小
$filename[]=$path;//获取文件名称
$filetime[]=date("Y-m-dH:i:s",filemtime($path));//获取文件最近修改日期
$return[]=$url.'/'.$file;
}
}
}
@closedir($dh);//关闭目录流
array_multisort($filesize,SORT_DESC,SORT_NUMERIC,$return);//按大小排序
//array_multisort($filename,SORT_DESC,SORT_STRING,$files);//按名字排序
//array_multisort($filetime,SORT_DESC,SORT_STRING,$files);//按时间排序
return$return;//返回文件
}
⑧ php如何排序置顶
第一步,在文章表里面建两个字段,用于做置顶功能。一个是top字段,timestamp类型,默认选“定义”,用于存储置顶操作的时间;还有一个flag字段,int类型,用于判断是否置顶,置顶为1,否则为0。。
第二步,模板页面修改。列表选项里面加置顶列,下面对应的行写如下代码:
<td class="center"> {{if $logs[data].flag}} <a href="javaScript:void(0);" onclick="istop('{{$logs[data].id}}',0)">取消置顶</a>{{else}} <a href="javascript:void(0);" onclick="istop('{{$logs[data].id}}',1)">置顶</a>{{/if}}</td>
就是用flag判断是否置顶了。
页面对应的置顶js:
function istop(id,flag){
$.ajax({
type: "POST",
url: "?m={{'article'|encrypt}}&a=savePost",data: "id="+id+"&flag="+flag,
dataType:"json",
success: function(msg){
if(msg.status == "true")
{
window.location= '?m={{'article'|encrypt}}';}
else
{
alert(msg.message);
}
}
});
}
第三步,程序里只要稍作修改即可。先按是否置顶排序,再按置顶时间排序,再按默认的排序。
$sql .=" ORDER BY flag DESC,top DESC,id DESC ";(还记得我们添加的字段吗?)
这样就完成了文章置顶的功能。
⑨ 用PHP如何实现冒泡排序
<?php//冒泡排序方法functionbubblesort(&$arr){
//定义一个变量保存交换的值
$temp=0;
for($i=0;$i<count($arr);$i++){
for($j=0;$j<count($arr)-$i-1;$j++){
if($arr[$j]>$arr[$j+1]){
//如果前面的那个数大于后面的那个数,那么他们就进行交换
$temp=$arr[$j];$arr[$j]=$arr[$j+1];$arr[$j+1]=$temp;
}
}
}
}
$arr=array(100,99,200,5,-4,6,-7);
bubbleSort($arr);
print_r($arr);
//数组是值传递,所以传递的时候加个&符号就是地址传递,改变外部变量?>
⑩ 用php代码实现将一个数组的值排列顺序改为第一个数字最大,第二个数字
<?php
//自定义排序函数my_sort
functionmy_sort($arr){
rsort($arr);//从大到小排序
$new=array();
$count=count($arr);
for($i=0;$i<$count;$i++){
$new[]=$arr[$i];
if($count-$i-1>$i){
$new[]=$arr[$count-$i-1];
if($count-$i-2<=$i){
break;
}
}else{
break;
}
}
return$new;
}
$arr=array(1,3,5,7,9,2,4,6,8,10);
$new=my_sort($arr);
echo'<pre>';
print_r($arr);
print_r($new);
echo'</pre>';
exit;