当前位置:Gxlcms > PHP教程 > php冒泡排序快速排序

php冒泡排序快速排序

时间:2021-07-01 10:21:17 帮助过:13人阅读

/******
1)冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边。
2)对整列数两两交换一次,最小的数在最左边,每次都能得一个在剩下的数中的最小 的数,“冒”出来的数组成一个有序区间,剩下的值组成一无序区间,且有序区间中每一元素值都比无序区间的小。
3)快速排序:基准数,左右二个数组,递归调用,合并。
4)插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取第一个元素插入左区间,若此元素比左边区间最右边的元素大,留在原处,若此元素比左 边区间最右边的元素小,则插在最右边5)元素的原位置,同时最右边元素右移一位,计算器减一,重新和前面的元素比较,直到前面的元素比要插入元素小为止,重复 上述步骤。
6)注意区间端点值的处理,及数组的第一个元素下标为0.
***/


$a
=array('3','8','1','4','11','7'); print_r($a); $len = count($a); //从小到大for($i=1;$i<$len;$i++) { for($j=$len-1;$j>=$i;$j--) if($a[$j]<$a[$j-1]) {//如果是从大到小的话,只要在这里的判断改成if($b[$j]>$b[$j-1])就可以了$x=$a[$j]; $a[$j]=$a[$j-1]; $a[$j-1]=$x; } } print_r($a); //另一种方法 从小到大$b=array('4','3','8','9','2','1'); $len=count($b); for($k=1;$k<$len;$k++) { for($j=$len-1,$i=0;$i<$len-$k;$i++,$j--) if($b[$j]<$b[$j-1]){ //如果是从大到小的话,只要在这里的判断改成if($b[$j]>$b[$j-1])就可以了$tmp=$b[$j]; $b[$j]=$b[$j-1]; $b[$j-1]=$tmp; } print_r($b); echo " "; } //下面的这个执行效率更高function maopao($arr) { $len = count($arr); for($i=1; $i<$len; $i++)//最多做n-1趟排序 { $flag = false; //本趟排序开始前,交换标志应为假for($j=$len-1;$j>=$i;$j--) { if($arr[$j]<$arr[$j-1])//交换记录 {//如果是从大到小的话,只要在这里的判断改成if($arr[$j]>$arr[$j-1])就可以了$x=$arr[$j]; $arr[$j]=$arr[$j-1]; $arr[$j-1]=$x; $flag = true;//发生了交换,故将交换标志置为真 } } if(! $flag)//本趟排序未发生交换,提前终止算法return$arr; } } $shuz = array('2','4','1','8','5'); $bb = maopao($shuz); print_r($bb); // 快速排序function kuaisu($arr){ $len = count($arr); if($len <= 1){ return$arr; } $key = $arr[0]; $left_arr = array(); $right_arr = array(); for($i=1; $i<$len;$i++){ if($arr[$i] <= $key){ $left_arr[] = $arr[$i]; }else{ $right_arr[] = $arr[$i]; } } $left_arr = kuaisu($left_arr); $right_arr = kuaisu($right_arr); returnarray_merge($left_arr, array($key), $right_arr); } $arr = array(23,98,54,2,9,62,34); print_r(kuaisu($arr));

以上就介绍了php 冒泡排序 快速排序,包括了插入排序方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

人气教程排行