1冒泡排序
原理是依次比较相邻两个数据,使之按照从小到大或者从大到小的方式排列,一次次的遍历最终使最大或最小的数据排到列表的顶端;
方法:1
function maopao($arr){
$len = count($arr);
for($i=0;$i<$len-1;$i++){
for($j=0;$j<$len-$i-1;$j++){
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j]= $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
方法:2
function maopao($arr,$len){
if($len <= 1){
return $arr;
}
for($i=0;$i<$len-1;$i++){
if($arr[$i]>$arr[$i+1]){
$temp = $arr[$i];
$arr[$i]= $arr[$i+1];
$arr[$i+1] = $temp;
}
}
$arr = maopao($arr,$len-1);
return $arr;
}
function maopao($arr){
$len = count($arr);
for($i=0;$i<$len-1;$i++){
if($arr[$i]>$arr[$i+1]){
$temp = $arr[$i];
$arr[$i]= $arr[$i+1];
$arr[$i+1] = $temp;
}
if($i == $len -2 ){
$i=-1;
$len -=1;
}
}
return $arr;
}
2,快速排序
原理是选择一个基准值进行一次遍历,把大于或小于基准值的数据分隔成两部分,然后依照此分法依次对两部数据进行再次的遍历分割,重复多次,数据就完成了排序
方法:1
function kuaisu($arr,$left,$right){
if($left>=$right){
return $arr;
}
$head = $left;
$foot = $right;
$key = $arr[$head];
while($head<$foot){
while($head<$foot && $arr[$foot]>=$key){
--$foot;
}
$arr[$head] = $arr[$foot];
while($head<$foot && $arr[$head] <= $key){
$head++;
}
$arr[$foot]= $arr[$head];
}
$arr[$head]= $key;
$arr = kuaisu($arr,$left,$head-1);
$arr = kuaisu($arr,$foot+1,$right);
return $arr;
}
方法:2
function kuaisu($arr){
$len = count($arr);
if($len<=1){
return $arr;
}
$min = array();
$equ = array();
$max = array();
$key = $arr[0];
for($i=0;$i<$len;$i++){
if($arr[$i]<$key){
$min[]=$arr[$i];
}
if($arr[$i]==$key){
$equ[]=$arr[$i];
}
if($arr[$i]>$key){
$max[]=$arr[$i];
}
}
return array_merge_recursive(kuaisu($min),$equ,kuaisu($max));
}
3,直插排序
原理是选取一个值插入到已经排序好的序列中,依次遍历插入,直到排好序列
方法:1
function insert($arr){
$len =count($arr);
for($i=0;$i<$len;$i++){
$key = $arr[$i];
for($j=$i;$j>=1;$j--){
if($arr[$j-1]>= $key){
$arr[$j] = $arr[$j-1];
}else{
break;
}
}
$arr[$j]=$key;
}
return $arr;
}
方法:2
function insert($arr){
$len = count($arr);
for($i=0;$i<$len;$i++){
for($j=$i;$j>=1;$j--){
if($arr[$j-1]>$arr[$j]){
$temp = $arr[$j];
$arr[$j]= $arr[$j-1];
$arr[$j-1]= $temp;
}else{
break;
}
}
}
return $arr;
}
4,希尔排序
原理是通过选择d<n的数据游标长度来分割数列为多组,每组进行插入排序,然后缩小d至1,重复首次的方式排序,直到所有数据为一组位置,数据排序完成
例如 $arr = array(1,4,2,5,9,8,3,6);
如果d=3,那么 $arr[0] 和 $arr[3] 进行比较 ,依次类推;完成一趟排序;然后在缩小d,重复上面的动作,直到d=1
function xier($arr){
$len = count($arr);
$d = floor($len/2);
for($d;$d>0;$d=floor($d/2)){
for($i=$d;$i<$len;$i++){
for($j=$i-$d;$j>=0;$j = $j-$d){
if($arr[$j]>$arr[$j+$d]){
$temp = $arr[$j];
$arr[$j]= $arr[$j+$d];
$arr[$j+$d] = $temp;
}
}
}
}
return $arr;
}
方法:2
function xier($arr){
$len = count($arr);
for($d = $len/2;$d>0;$d /=2){
for($i=$d;$i<$len;$i++){
$j = $i;
while($j-$d>=0 && $arr[$j] > $arr[$j-$d]){
$temp = $arr[$j];
$arr[$j] = $arr[$j-$d];
$arr[$j-$d] = $temp;
$j -= $d;
}
}
}
return $arr;
}
5,堆排序
原理是利用堆的特性,使其堆成为大根堆或小根堆,交换其堆顶值和该数列剩余数列值的最后一个值,然后再从新排列剩余数据的堆使其成为大或者小根堆,依次重复多次直到只剩一个数值,该数列排序完成;
function duixu($arr){
$len = count($arr);
//调整大堆(注:也可以小堆)
$dui = function($arr,$i,$end){
$key = $arr[$i];
for($j=$i*2+1;$j<$end;$j=$j*2+1){
if($j+1< $end && $arr[$j] < $arr[$j+1]){
$j++;
}
if($arr[$j]>$key){
$arr[$i] = $arr[$j];
$i=$j;
}else{break;}
}
$arr[$i] = $key;
return $arr;
};
// 把数组初始化堆
for($i=$len/2-1;$i>=0;$i--){
$arr = $dui($arr,$i,$len);
}
//进行对堆的排序
for($m = $len-1;$m>=0;$m--){
$temp =$arr[0];
$arr[0] = $arr[$m];
$arr[$m]= $temp;
$arr = $dui($arr,0,$m);
}
return $arr;
}
6.选择排序
原理就是每次遍历剩余的数列,找到与开始选定的游标对应的数据相比较,最大或者最小的数据的游标,然后交换其数值,直到最后的游标处。
function xuanze($arr){
$len = count($arr);
for($i=0;$i<$len-1;$i++){
$min = $i;
for($j=$min+1;$j<$len;$j++){
if($arr[$min] > $arr[$j]){
$min = $j;
}
}
if($min !=$i){
$temp = $arr[i];
$arr[$i] = $arr[$min];
$arr[$min] = $temp;
}
}
return $arr;
}
7 合并排序
原理是把两个已经排好的序的数列,合并成一个有序的数列的,其过程是先要分组已有的无序数列并排序,然后合并,
function megerArr($arrA,$arrB){
$arrC = array();
while(count($arrA) && count($arrB)){
$arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);
}
return array_merge($arrC, $arrA, $arrB);
}
function megerSort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
$m = floor($len/2);
$left = array_slice($arr, 0, $m);
$right = array_slice($arr, $m);
$left = megerSort($left);
$right = megerSort($right);
$arr = megerArr($left,$right);
return $arr;
}