用php实现的各种排序算法总结

用php实现的各种排序算法总结

优化php性能的五个实用技巧:

以下是五个优化技巧,熟练掌握后对于开发还是很有帮助的。

1. 对字符串使用单引号

PHP 引擎允许使用单引号和双引号来封装字符串变量,但是这个是有很大的差别的!使用双引号的字符串告诉 PHP 引擎首先去读取字符串内容,查找其中的变量,并改为变量对应的值。一般来说字符串是没有变量的,所以使用双引号会导致性能不佳。最好是使用字符串连接而不 是双引号字符串。

BAD:

$output = “This is a plain string”;

GOOD:

$output = 'This is a plain string';

BAD:

$type = “mixed”;

$output = “This is a $type string”;

GOOD:

$type = 'mixed';

$output = 'This is a ' . $type .' string';

2. 不要随便就复制变量

有时候为了使 PHP 代码更 加整洁,一些 PHP 新手(包括我)会把预定义好的变量复制到一个名字更简短的变量中,其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢。试想一下,在下面的例子 中,如果用户恶意插入 512KB 字节的文字到文本输入框中,这样就会导致 1MB 的内存被消耗!

BAD:

$description = $_POST['description'];

echo $description;

GOOD:

echo $_POST['description'];

3. 使用 echo 函数来输出字符串

使用 echo() 函数来打印结果出了有更容易阅读之外,在下个例子中,你还可以看到有更好的性能。

BAD:

print($myVariable);

GOOD:

echo $myVariable;

4. 不要在 echo 中使用连接符

很***PHP 程序员(有包括我)不知道在用 恶臭 输出多个变量的时候,其实可以使用逗号来分开的,而不必用字符串先把他们先连起来,如下面的第一个例子中,由于使用了连接符就会有性能问题,因为这样就会 需要 PHP 引擎首先把所有的变量连接起来,然后在输出,而在第二个例子中,PHP 引擎就会按照循序输出他们。

BAD:

echo 'Hello, my name is' . $firstName . $lastName . ' and I live in ' . $city;

GOOD:

echo 'Hello, my name is' , $firstName , $lastName , ' and I live in ' , $city;

5. 使用 switch/case 代替 if/else

对于只有单个变量的判断,使用 switch/case 语句而不是 if/else 语句,会有更好的性能,并且代码更加容易阅读和维护。

BAD:

if($_POST['action'] == 'add‘) {

addUser();

} elseif ($_POST['action'] == 'delete’) {

deleteUser();

} elseif ($_POST['action'] == 'edit‘) {

editUser();

} else {

defaultAction();

}

GOOD:

switch($_POST['action']) {

case 'add':

addUser();

break;

case 'delete':

用php实现的各种排序算法,冒泡排序,交换排序,选择法排序,插入法排序,快速排序,根据实际情况可选则不同的排序算法。效率也有所不同。

冒泡排序:<?php

function BubbleSort($arr){

$num = count($arr);

for($i=1;$i<$num;$i++){

for($j=$num-1;$j>=$i;$j--){

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

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

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

$arr[$j] = $iTemp;

}

}

}

return $arr;

}

?>

交换法排序:<?php

function ExchangeSort($arr){

$num = count($arr);

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

for($j=$i+1;$j<$num;$j++){

if($arr[$j]<$arr[$i]){

$iTemp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $iTemp;

}

}

}

return $arr;

}

?>

选择法排序:<?php

function SelectSort($arr){

$num = count($arr);

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

$iTemp = $arr[$i];

$iPos = $i;

for($j=$i+1;$j<$num;$j++){

if($arr[$j]<$iTemp){

$iTemp = $arr[$j];

$iPos = $j;

}

}

$arr[$iPos] = $arr[$i];

$arr[$i] = $iTemp;

}

return $arr;

}

?>

插入法排序:<?php

function InsertSort($arr){

$num = count($arr);

for($i=1;$i<$num;$i++){

$iTemp = $arr[$i];

$iPos = $i-1;

while(($iPos>=0) && ($iTemp<$arr[$iPos])){ $arr[$iPos+1] = $arr[$iPos];

$iPos--;

}

$arr[$iPos+1] = $iTemp;

}

return $arr;

}

?>

快速排序 :<?php

function QuickSort($arr){ $num = count($arr); $l=$r=0;

for($i=1;$i<$num;$i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i];

$l++;

}else{

$right[] = $arr[$i];

$r++;

}

}

if($l > 1){

$left = QuickSort($left); }

$new_arr = $left;

$new_arr[] = $arr[0]; if($r > 1){

$right = QuickSort($right); }

for($i=0;$i<$r;$i++){ $new_arr[] = $right[$i]; }

return $new_arr;

}

$arr = array(7,1,6,5,2);

$arr_new = QuickSort($arr); ?>

deleteUser();

break;

case 'edit':

editUser();

break;

default:

 

第二篇:排序算法总结

现有序列{9,3,5,1,6,2,8,4,7},以此为例子,阐述各个常用排序算法。

直接插入排序:

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。 直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。 9,3,5,1,6,2,8,4,7

3,9,5,1,6,2,8,4,7

3,5,9,1,6,2,8,4,7

1,3,5,9,6,2,8,4,7

1,3,5,6,9,2,8,4,7

1,2,3,5,6,9,8,4,7

1,2,3,5,6,8,9,4,7

1,2,3,4,5,6,8,9,7

1,2,3,4,5,6,7,8,9

希尔排序:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

取增量为5

则分为五个组(9,2)(3,8)(5,4)(1,7)(6),对这些分组内部进行插入排序, 得到:2,3,4,1,6,8,5,7,9

取增量为3

则分为三个组 (2,1,5)(3,6,7)(4,8,9)

得到:1,3,4,2,6,8,5,7,9

取增量为1

得到 1,2,3,4,5,6,7,8,9

9,3,5,1,6,2,8,4,7 增量=5 对同一颜色进行内部插入排序 2,3,4,1,6,8,5,7,9 增量=3

1,3,4,2,6,8,5,7,9 增量=1

1,2,3,4,5,6,7,8,9

冒泡排序:

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。

9,3,5,1,6,2,8,4,7

3,5,1,6,2,8,4,7,9

3,1,5,2,6,4,7,8,9

1,3,2,5,4,6,7,8,9

1,2,3,4,5,6,7,8,9

1,2,3,4,5,6,7,8,9

1,2,3,4,5,6,7,8,9

1,2,3,4,5,6,7,8,9

快速排序:

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:

1)设置两个变量I、J,排序开始的时候:I=1,J=N-1;

2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];

3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换;

4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换; 5)重复第3、4步,直到 I=J;

935162847

735162849

43516287 9

23516487 9

23416587 9

23146587 9

123 4 5687 9

123 4 5 6 78 9

123456789

归并排序:

归并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,直到得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。 9,3,5,1,6,2,8,4,7

3,9, 1,5, 2,6, 4,8, 7

1,3,5,9, 2,4,6,8, 7 两次合并后

1,2,3,4,5,6,8,9, 7 第三次合并后

1,2,3,4,5,6,7,8,9 第四次合并后

选择排序:

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

选择排序是不稳定的排序方法。

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。 9,3,5,1,6,2,8,4,7 第一次扫描,1最小,将1与第一个数交换 1,3,5,9,6,2,8,4,7 第二次扫描,2最小,将2与第二个数交换 1,2,5,9,6,3,8,4,7

1,2,3,9,6,5,8,4,7

1,2,3,4,6,5,8,9,7

1,2,3,4,5,6,8,9,7

1,2,3,4,5,6,7,9,8

1,2,3,4,5,6,7,8,9 第八次扫描,8最小,将8与第八个数交换 1,2,3,4,5,6,7,8,9

基数排序:

需而外构造十个数组或链表。对该例子进行一次分配就可排好。

相关推荐