我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

php常用算法和数据结构 php常用算法和数据结构的区别

php几种排序算法实例详解

四种排序算法的PHP实现:

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了新野免费建站欢迎大家使用!

1) 插入排序(Insertion Sort)的基本思想是: 

每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

2) 选择排序(Selection Sort)的基本思想是: 

每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

3) 冒泡排序的基本思想是: 

两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

1. sort.php文件如下:

?php

class Sort {

private $arr  = array(); 

private $sort  = 'insert';

private $marker = '_sort';

private $debug = TRUE;

/**

* 构造函数

*

* @param  array  例如:

$config = array (

'arr' = array(22,3,41,18) , //需要排序的数组值

'sort' = 'insert', //可能值: insert, select, bubble, quick

'debug' = TRUE //可能值: TRUE, FALSE

)

*/

public function construct($config = array()) {

if ( count($config)  0) {

$this-_init($config);

}

}

/**

* 获取排序结果

*/

public function display() {

return $this-arr;

}

/**

* 初始化

*

* @param  array

* @return bool

*/

private function _init($config = array()) {

//参数判断

if ( !is_array($config) OR count($config) == 0) {

if ($this-debug === TRUE) {

$this-_log("sort_init_param_invaild");

}

return FALSE;

}

//初始化成员变量

foreach ($config as $key = $val) {

if ( isset($this-$key)) {

$this-$key = $val;

}

}

//调用相应的成员方法完成排序

$method = $this-sort . $this-marker;

if ( ! method_exists($this, $method)) {

if ($this-debug === TRUE) {

$this-_log("sort_method_invaild");

}

return FALSE;

}

if ( FALSE === ($this-arr = $this-$method($this-arr)))

return FALSE;

return TRUE;

}

/**

* 插入排序

* @param  array

* @return bool

*/

private function insert_sort($arr) {

//参数判断

if ( ! is_array($arr) OR count($arr) == 0) {

if ($this-debug === TRUE) {

$this-_log("sort_array(insert)_invaild");

}

return FALSE;

}

//具体实现

$count = count($arr);

for ($i = 1; $i  $count; $i++) {

$tmp = $arr[$i];

for($j = $i-1; $j = 0; $j--) { 

if($arr[$j]  $tmp) {

$arr[$j+1] = $arr[$j];

$arr[$j] = $tmp;

}

}

}

return $arr;

}

/**

* 选择排序

* @param  array

* @return bool

*/

private function select_sort($arr) {

//参数判断

if ( ! is_array($arr) OR count($arr) == 0) {

if ($this-debug === TRUE) {

$this-_log("sort_array(select)_invaild");

}

return FALSE;

}

//具体实现

$count = count($arr);

for ($i = 0; $i  $count-1; $i++) {

$min = $i;

for ($j = $i+1; $j  $count; $j++) {

if ($arr[$min]  $arr[$j]) $min = $j;

}

if ($min != $i) {

$tmp = $arr[$min];

$arr[$min] = $arr[$i];

$arr[$i] = $tmp;

}

}

return $arr;

}

/**

* 冒泡排序

* @param  array

* @return bool

*/

private function bubble_sort($arr) {

//参数判断

if ( ! is_array($arr) OR count($arr) == 0) {

if ($this-debug === TRUE) {

$this-_log("sort_array(bubble)_invaild");

}

return FALSE;

}

//具体实现

$count = count($arr);

for ($i = 0; $i  $count; $i++) {

for ($j = $count-1; $j  $i; $j--) {

if ($arr[$j]  $arr[$j-1]) {

$tmp = $arr[$j];

$arr[$j] = $arr[$j-1];

$arr[$j-1] = $tmp;

}

}

}

return $arr;  

}

/**

* 快速排序

* @by 

* @param  array

* @return bool

*/

private function quick_sort($arr) {

//具体实现

if (count($arr) = 1) return $arr; 

$key = $arr[0];

$left_arr = array();

$right_arr = array();

for ($i = 1; $i  count($arr); $i++){

if ($arr[$i] = $key)

$left_arr[] = $arr[$i];

else

$right_arr[] = $arr[$i];

}

$left_arr = $this-quick_sort($left_arr);

$right_arr = $this-quick_sort($right_arr); 

return array_merge($left_arr, array($key), $right_arr);

}

/**

* 日志记录

*/

private function _log($msg) {

$msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n';

return @file_put_contents('sort_err.log', $msg, FILE_APPEND);

}

}

/*End of file sort.php*/

/*Location htdocs/sort.php */

2. sort_demo.php文件如下:

?php

require_once('sort.php');

$config = array (

'arr' = array(23, 22, 41, 18, 20, 12, 200303,2200,1192) ,

//需要排序的数组值

'sort' = 'select',

//可能值: insert, select, bubble, quick

'debug' = TRUE

//可能值: TRUE, FALSE

);

$sort = new Sort($config);

//var_dump($config['arr']);

var_dump($sort-display());

/*End of php*/

php程序员有必要学习数据结构与算法吗?

没必要去学什么排序、查找的算法,没别要去学什么链表、堆栈、队列等数据结构的细节。

提升主要是快速开发,接到项目可以一晚上交货的就是高手。

不过工资与上面的都无关,工资主要决定于你和领导的关系。

PHP实现常见的排序算法

注:为方便描述,下面的排序全为正序(从小到大排序)

假设有一个数组[a,b,c,d]

冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变。具体步骤:

1,比较a,b这两个元素,如果ab,则交换位置,数组变为:[b,a,c,d]

2,比较a,c这两个元素,如果ac,则位置不变,数组变为:[b,a,c,d]

3,比较c,d这两个元素,如果cd,则交换位置,数组变为:[b,a,d,c]

完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了。

第二轮比较结束后,第二大的数也会冒到倒数第二的位置。

依次类推,再进行第三轮,,,

就这样最大的数一直往后排(冒),最后完成排序。所以我们称这种排序算法为冒泡排序。

选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面。具体步骤如下:

插入排序步骤大致如下:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

步骤:

从数列中挑出一个元素,称为 “基准”(pivot),

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

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常用算法和数据结构 php常用算法和数据结构的区别
文章出自:http://mswzjz.cn/article/ddjihis.html

其他资讯