1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| //**选择排序**
/\* 每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法 */
function select_sort($arr){
for($i=0,$len=count($arr);$i<$len-1;$i++){ //假设最小值位置 $p=$i; //当前都和那些元素比较,$i后面的元素
for($j=$i+1;$j<$len;$j++){
if($arr\[$p\]>$arr\[$j\]){ //比较发现更小的,记录最小值位置,并且在在下次比较时
$p=$j; } } //已确定最小值的位置,保存到$p中
if($p != $i){ $tmp=$arr\[$p\]; $arr\[$p\]=$arr\[$i\]; $arr\[$i\]=$tmp; } }
return $arr; }
//**插入排序**
/\* 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到下一位置中 */
function insert_sort($arr) { //区分 哪部分是已经排序好的 //哪部分是没有排序的 //找到其中一个需要排序的元素 //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素 //利用循环就可以标志出来 //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了, //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
for($i=1, $len=count($arr); $i<$len; $i++) { //获得当前需要比较的元素值。 $tmp = $arr\[$i\]; //内层循环控制 比较 并 插入 for($j=$i-1;$j>=0;$j--) { //$arr\[$i\];//需要插入的元素; $arr\[$j\];//需要比较的元素 if($tmp < $arr\[$j\]) { //发现插入的元素要小,交换位置 //将后边的元素与前面的元素互换 $arr\[$j+1\] = $arr\[$j\]; //将前面的数设置为 当前需要交换的数 $arr\[$j\] = $tmp; } else { //如果碰到不需要移动的元素 //由于是已经排序好是数组,则前面的就不需要再次比较了。 break; } } } //将这个元素 插入到已经排序好的序列内。 //返回 return $arr; }
//**快速排序法** 对冒泡排序的一种改进 /\* 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列 */
function quick\_sort($arr) { //先判断是否需要继续进行
$length = count($arr); if($length <= 1) { return $arr;
} //如果没有返回,说明数组内的元素个数 多余1个,需要排序 //选择一个标尺 //选择第一个元素
$base\_num = $arr\[0\]; //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 //初始化两个数组 $left\_array = array();//小于标尺的 $right\_array = array();//大于标尺的 for($i=1; $i<$length; $i++) { if($base\_num > $arr\[$i\]) { //放入左边数组 $left\_array\[\] = $arr\[$i\]; } else { //放入右边 $right\_array\[\] = $arr\[$i\]; } } //再分别对 左边 和 右边的数组进行相同的排序处理方式 //递归调用这个函数,并记录结果 $left\_array = quick\_sort($left\_array); $right\_array = quick\_sort($right\_array); //合并左边 标尺 右边 return array\_merge($left\_array, array($base\_num), $right\_array); } print\_r($arr); echo "<br />冒泡"; print\_r(array\_reverse($arr)); echo "<br />冒泡排序"; rint\_r(getpao($arr)); echo "<br />选择排序"; print\_r(select\_sort($arr)); echo "<br />插入排序"; print\_r(insert\_sort($arr)); echo "<br />快速排序"; print\_r(quick_sort($arr)); echo "<br />"; // **递归** 函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去 function test($a=0,&$result=array()){ // global $result; $a++; if($a<10){ $result\[\]=$a; test($a,$result); } return $result; }
print_r(test()); echo "<br />";
//**递归 利用全局变量**
function test($a=0,$result=array()){ global $result; $a++; if ($a<10) { $result\[\]=$a; test($a,$result); } return $result; }
//**递归 利用静态变量** 递归函数间作为“桥梁"的变量利用static进行初始化,每一次递归都会保留"桥梁变量"的值。
function test($a=0){ static $result=array(); $a++; if ($a<10) { $result\[\]=$a; test($a); } return $result; }
//**递归 无限级分类**
$area = array( array('id'=>1,'area'=>'北京','pid'=>0), array('id'=>2,'area'=>'广西','pid'=>0), array('id'=>3,'area'=>'广东','pid'=>0), array('id'=>4,'area'=>'福建','pid'=>0), array('id'=>11,'area'=>'朝阳区','pid'=>1), array('id'=>12,'area'=>'海淀区','pid'=>1), array('id'=>21,'area'=>'南宁市','pid'=>2), array('id'=>45,'area'=>'福州市','pid'=>4), array('id'=>113,'area'=>'亚运村','pid'=>11), array('id'=>115,'area'=>'奥运村','pid'=>11), array('id'=>234,'area'=>'武鸣县','pid'=>21) );
function t($arr,$pid=0,$lev=0){ static $list=array(); foreach ($arr as $v){ if($v\['pid'\]==$pid){ echo str\_repeat("",$lev).$v\['area'\]."<br />"; $list\[\]=$v; t($arr,$v\['id'\],$lev+1); } } return $list; } $list=t($area); print\_r($area); echo "<br />"; print_r($list); ?>
|