几种常用的排序方式(php实现)
1.普通冒泡排序
<?php function buddle_sort($a){ $i=0; $j=0; $n= sizeof($a); if($n==0) {return false; }else{ for($i=0;$i<$n;$i++) { for($j=$n-1;$j>$i;$j--) { if($a[$j]>$a[$i]){ $m = $a[$i]; $a[$i]= $a[$j]; $a[$j]= $m; } } } } return $a; } $l = array(20,10,15,4,2,45,11); $R=buddle_sort($l); foreach($R as $value) echo $value,"_"; ?>
2.改进冒泡排序
<?php function buddle_sort($a){ $i=0; $j=0; $n= sizeof($a); if($n==0) {return false; }else{ $flag = true; for($i=$n-1;$i>0 && $flag;$i--) { $flag = false; for($j=0;$j<$i;$j++) { if($a[$j]>$a[$j+1]){ $m = $a[$j+1]; $a[$j+1]= $a[$j]; $a[$j]= $m; $flag = true; } } } } return $a; } $l = array(10,15,20,25,30,31,5); $R=buddle_sort($l); foreach($R as $value) echo $value,"_"; ?>
3.选择排序
<?php function buddle_sort($a){ $i=0; $j=0; $n= sizeof($a); if($n==0) {return false; }else{ for($i=$n-1;$i>0;$i--) { $max = $i; for($j=0;$j<$i;$j++) { if($a[$j]>$a[$max]){ $max = $j; } } if($a[$max] >$a[$i]) { $m = $a[$i]; $a[$i]=$a[$max]; $a[$max] = $m; } } } return $a; } $l = array(10,1,2,5,30,31,6); $R=buddle_sort($l); foreach($R as $value) echo $value,"_"; ?>
4.插入排序
<?php function simple_sort($a){ $l = sizeof($a); if(!$l){ return false; } for($i=1;$i<$l;$i++){ if($a[$i]<$a[$i-1]){ for($j = $i;$j>0;$j--){ if($a[$j]<$a[$i]) { break; } } $v=$a[$i]; for($m=$i;$m>$j+1;$m--) { $a[$m]=$a[$m-1]; } $a[$j+1] =$v; } } return $a; } $s =array(2,13,5,12,6,67,54,12); $R=simple_sort($s); foreach ($R as $value) { echo $value,"_"; }
5.快排1,浪费空间
<?php function quickSort($arr){ if(count($arr)>1){ $k=$arr[0]; $x=array(); $y=array(); $_size=count($arr); for($i=1;$i<$_size;$i++){ if($arr[$i]<=$k){ $x[]=$arr[$i]; }elseif($arr[$i]>$k){ $y[]=$arr[$i]; } } $x=quickSort($x); $y=quickSort($y); return array_merge($x,array($k),$y); }else{ return $arr; } } $a =array(2,1,2,4,12,5,6,8); $r = quickSort($a); var_dump($r); ?>
6.快排2,推荐,在一个数组内实现。
<?php $a = array(2, 1, 5, 3, 6, 4, 8, 9, 1); function partition(&$a, $low, $high) { $pivot = $a[$low]; while($low < $high) { while($low < $high && $a[$high] >= $pivot) { $high--; } $a[$low] = $a[$high]; while($low < $high && $a[$low] <= $pivot) { $low++; } $a[$high] = $a[$low]; } $a[$low] = $pivot; return $low; } function qs(&$a, $low, $high) { if ($low < $high) { $p = partition($a, $low, $high); qs($a, $low, $p-1); qs($a, $p+1, $high); } } qs($a, 0, 8); var_dump($a);
7.补充一个 线性排序,对于不大于100的数字,排序非常快
function sort1($a){ $s= array(); for($j = 0;$j <sizeof($a);$j++) { $s[$a[$j]] = @$s[$a[$j]]+1; } return $s; } function sort2($a){ if(!sizeof($a)){ return false; } $max = $a[0]; for($i = 0;$i < sizeof($a);$i++) { if($a[$i]>$max){ $max = $a[$i]; } } $resort = sort1($a); //var_dump($resort);exit; $m=array(); for($i = 0;$i<$max+1;$i++) { while(@$resort[$i]){ $m = array_merge($m,array($i)); $resort[$i] --; } } return $m; } $a= array(2,5,4,7,8,9,1,2,3); $z = sort2($a); var_dump($z);