常用排序算法和查找算法的PHP实现


<?php
/**
 * 冒泡排序
 * 冒泡排序就是依次比较相邻的两个数,根据采用的排序规则决定是否交换两个数的位置。
 * 在此以升序为例来进行讲解。
 * 第一轮:首先比较第一个数和第二个数,将小数放前,大数放后,然后比较第二个数和第三个数,
 * 将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。到第一轮结束
 * 的时候,已经成功地将最大的数放到了最后。
 * 第二轮:可能由于第二个数和第三个数的交换,使得第一个数不再小于第二个数,所以新一轮的比较
 * 仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数,由于最后一个位置上的
 * 数已经是最大的,所以无须再对其进行比较。到第二轮结束的时候,再倒数第二个位置上得到一个新
 * 的最大数,也就是给定数据中的第二大的数。
 * 重复以上过程,直到最后一轮比较完第一个数和第二个数,完成整个排序功能。
 */
function bubble_sort($arr) {
    if(count($arr) <= 1) {
        return $arr;
    }
    $count = count($arr);
    for($i=0; $i<$count; $i++) {
        for($j=0; $j<$count-$i-1; $j++) {
            //依次取两个相邻的数进行比较
            //如果前面的数比后面的数大则互换位置
            if($arr[$j] > $arr[$j+1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}
$arr = array(5,25,8,3,6,10,80,1,30,100);
var_dump(bubble_sort($arr));

/**
 * 选择排序
 * 选择排序就是以第一个数为准,将其后面的数与其进行比较,
 * 根据排序规则来确定是否交换两个数。
 * 第一轮:以第一个数为基准,从第二个数开始,将后面的数据与第一个数一一进行对比,
 * 如果有比第一个数还小的,那么就将第一个数与该数进行交换,直到比到最后一个数为止。
 * 第二轮:第一轮结束后,第一个数是给定排序数中最小的数,因此第二轮以第二个数为基准,
 * 将其后的数依次与其进行比较,满足条件则进行交换,直到比较到最后一个数为止。
 * 重复以上操作,直到以倒数第二个数为基准,进行最后一轮比较操作为止。
 */
function select_sort($arr) {
    if(count($arr) <= 1) {
        return $arr;
    }
     $count = count($arr);
     for($i=0;$i<$count;$i++) {
         for($j=$i+1;$j<$count;$j++) {
             if($arr[$i] > $arr[$j]) {
                 $tmp = $arr[$i];
                 $arr[$i] = $arr[$j];
                 $arr[$j] = $tmp;
             }
         }
     }
     return $arr;
}
$arr = array(5,25,8,3,6,10,80,1,30,100);
var_dump(select_sort($arr));

/**
 * 插入排序
 * 插入排序就是每一步都将一个待排数据按排序规则插入到已经排序的
 * 数据中的适当位置,直到全部插入完毕。
 */
function insert_sort($arr) {
    if(count($arr) <= 1) {
        return $arr;
    }
    $count = count($arr);
    for($i=1;$i<$count;$i++) {
        //获取后一位数
        $tmp = $arr[$i];
        //获取前一位数
        $j = $i-1;
        while($j>=0 && $arr[$j]>$tmp) {
            $arr[$j+1] = $arr[$j];
            $arr[$j] = $tmp;
            $j--;
        }
    }
    return $arr;
}
$arr = array(5,25,8,3,6,10,80,1,30,100);
var_dump(insert_sort($arr));

/**
 * 快速排序
 * 快速排序是对冒泡排序的一种改进
 * 此方法的基本思想是:将所要进行排序的数分为左右两个部分,
 * 其中一部分的所有数据都比另外一部分的数据小,然后将所分得的两部分数据
 * 进行同样的划分,重复执行以上的划分操作,直到所有要进行排序的数据变为
 * 有序为止。
 */
function quick_sort($arr) {
    if(count($arr) <= 1) {
        return $arr;
    }
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for($i=1;$i<count($arr);$i++) {
        if($arr[$i]<=$key) {
            $left_arr[] = $arr[$i];
        }else {
            $right_arr[] = $arr[$i];
        }
    }
    $left_arr= quick_sort($left_arr);
    $right_arr= quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}
$arr = array(5,25,8,3,6,10,80,1,30,100);
var_dump(quick_sort($arr));

/**
 * 二分法查找
 * 二分法查找也称折半查找,其优点是查找速度快,缺点是要求所查找的数据必须是有序序列。
 * 该算法的基本思想是将所要查找的序列的中间位置与所要查找的元素进行比较,如果相等则
 * 表示查找成功,否则将以该位置为基准将所要查找的序列分为左右两部分。然后来选择所要
 * 查找的元素可能存在的那部分序列,对其采用同样的方法进行查找,直至确定所要查找的元
 * 素是否存在。
 */
function half_search($arr, $search_val) {
    $low = 0;
    $high = count($arr)-1;
    while($low <= $high) {
        $mid = ceil(($low+$high)/2);
        $mid_val = $arr[$mid];
        if($mid_val < $search_val) {
            $low = $mid+1;
        }elseif($mid_val > $search_val) {
            $high = $mid-1;
        }else {
            return $mid_val;
        }
    }
}
$arr = array(0,1,2,3,4,5,6,7,8,9);
var_dump(half_search($arr, 8));
?>

没事可以看看,就当是锻炼思维了……


《 “常用排序算法和查找算法的PHP实现” 》 有 2 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注