常见五种排序算法PHP

来源:互联网 发布:动画软件有哪些 编辑:程序博客网 时间:2024/06/05 03:03

一、冒泡排序
稳定,O(n^2),设置了flag算是一种优化,避免了后续没必要的比较

function BubbleSort($arr) {    $len = count($arr);    //该层循环控制 需要冒泡的轮数    for ($i = 1; $i < $len; $i++) {        $flag = false;    //本趟排序开始前,交换标志应为假        //该层循环用来控制每轮 冒出一个数 需要比较的次数        for ($k = 0; $k < $len - $i; $k++) {            //从小到大排序            if ($arr[$k] > $arr[$k + 1]) {                $tmp = $arr[$k + 1];                $arr[$k + 1] = $arr[$k];                $arr[$k] = $tmp;                $flag = true;            }        }        if(!$flag) return $arr;    }}

二、选择排序
不稳定,O(n^2)

function selectSort($array){    for($i = 0;$i < count($array) - 1;$i++){        $minVal = $array[$i]; //假设$i就是最小值        $minValIndex = $i;        for($j = $i+1;$j < count($array);$j++){            if($minVal > $array[$j]){ //从小到大排列                $minVal = $array[$j]; //找最小值                $minValIndex = $j;            }        }        if($i != $minValIndex){          //交换两个值          $temp = $array[$i];          $array[$i] = $array[$minValIndex];          $array[$minValIndex] = $temp;        }    }}

三、插入排序
稳定,O(n^2)

function insertSort($arr) {    //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列    $len=count($arr);    for ($i=1; $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 quickSort($array){    //判断参数是否是一个数组    if(!is_array($arr)) return false;    //递归出口:数组长度为1,直接返回数组    $length=count($arr);    if($length<=1) return $arr;    $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素    $leftArray = array();    $rightArray = array();    foreach($array as $v){        if($v > $mid){            $rightArray[] = $v; //把比$mid大的数放到一个数组里        }else{            $leftArray[] = $v; //把比$mid小的数放到另一个数组里        }    }    $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割    $rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割    return array_merge($leftArray ,$mid,$rightArray );}

五、归并排序

/** 归并排序* 归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。* 这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。* */function mergeSort(&$arr){    $len = count($arr);    msort($arr,0,$len-1);}function msort(&$arr,$low,$high){    if($low<$high){        $mid = floor(($low+$high)/2);        msort($arr, $low, $mid);        msort($arr,$mid+1,$high);        mergeArray($arr,$low,$mid,$high);    }}function mergeArray(&$arr,$low,$mid,$high){    $i = $low;    $j = $mid+1;    while($i<=$mid && $j<=$high){        if($arr[$i]<$arr[$j]){            $tmp[] = $arr[$i++];        }else{            $tmp[] = $arr[$j++];        }    }    while($i<=$mid){        $tmp[] = $arr[$i++];    }    while($j<=$high){        $tmp[] = $arr[$j++];    }    $len = count($tmp);    for($k=0;$k<$len;$k++){        $arr[$low+$k] = $tmp[$k];    }}