• php常见的几种排序以及二分法查找


    <?php

    1.插入排序

    思想:

    每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止。

    示例:

    [初始关键字] [49] 38 65 97 76 13 27 49
    J=2(38) [38 49] 65 97 76 13 27 49
    J=3(65) [38 49 65] 97 76 13 27 49
    J=4(97) [38 49 65 97] 76 13 27 49
    J=5(76) [38 49 65 76 97] 13 27 49
    J=6(13) [13 38 49 65 76 97] 27 49
    J=7(27) [13 27 38 49 65 76 97] 49
    J=8(49) [13 27 38 49 49 65 76 97]

    时间复杂度:

    如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。


    //插入排序
    function insertSort($arr){
    $count=count($arr);
    for($i=1;$i<$count;$i++){
    $tem=$arr[$i];
    $j=$i-1;
    while ($arr[$j]>$tem){
    $arr[$j+1]=$arr[$j];
    $arr[$j]=$tem;
    $j--;
    }
    }
    return  $arr;

    }

    2.选择排序

    思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

    示例:

    [初始关键字] [49 38 65 97 76 13 27 49]
    第一趟排序后 13 [38 65 97 76 49 27 49]
    第二趟排序后 13 27 [65 97 76 49 38 49]
    第三趟排序后 13 27 38 [97 76 49 65 49]
    第四趟排序后 13 27 38 49 [49 97 65 76]
    第五趟排序后 13 27 38 49 49 [97 97 76]
    第六趟排序后 13 27 38 49 49 76 [76 97]
    第七趟排序后 13 27 38 49 49 76 76 [ 97]
    最后排序结果 13 27 38 49 49 76 76 97

    时间复杂度:

    时间复杂度为o(n2),不稳定排序,适合规模比较小的


    //选择排序
    function selectSort($arr){
    $count = count($arr);
    for($i=0;$i<$count-1;$i++){
    $k=$i;
    for($j=$i+1;$j<$count;$j++){
    if($arr[$k]>$arr[$j])
    $k=$j;
    }
    $temp=$arr[$i];
    $arr[$i]=$arr[$k];
    $arr[$k]=$temp;
    }
    return $arr;
    }

    3.冒泡排序

    思想:

    两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

    示例:

    49 13 13 13 13 13 13 13 
    38 49 27 27 27 27 27 27
    65 38 49 38 38 38 38 38
    97 65 38 49 49 49 49 49
    76 97 65 49 49 49 49 49
    13 76 97 65 65 65 65 65
    27 27 76 97 76 76 76 76
    49 49 49 76 97 97 97 97

    时间复杂度:

    该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。


    //冒泡排序
    function bubbleSort($arr){
    $count = count($arr);
    if ($count <= 0) return false;
    for($i=0;$i<count($arr);$i++){
    $flag = false;    //本趟排序开始前,交换标志应为假
    for($j=count($arr)-1;$j>$i;$j--){
    if($arr[$j-1]>$arr[$j]){
    $temp=$arr[$j-1];
    $arr[$j-1]=$arr[$j];
    $arr[$j]=$temp;
    $flag=true;
    }
    }
    if(! $flag)//本趟排序未发生交换,提前终止算法
    return $arr;
    }
    //return $arr;
    }

    4.快速排序

    思想:

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    时间复杂度:

    快速排序主体算法时间运算量约 O(log2n) ,划分子区函数运算量约 O(n) ,所以总的时间复杂度为 O(nlog2n) ,它显然优于冒泡排序 O(n2). 可是算法的优势并不是绝对的。试分析,当原文件关键字有序时,快速排序时间复杂度是 O(n2), 这种情况下快速排序不快。而这种情况的冒泡排序是 O(n), 反而很快。在原文件记录关键字无序时的多种排序方法中,快速排序被认为是最好的一种排序方法。


    //快速排序
    function quickSort($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=quickSort($left_arr);
    $right_arr=quickSort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);
    }


    $arr=array(49,38,65,97,76,13,27,49);
    print_r(quickSort($arr));






    // 二分法查找
    function binarysearch($arr, $value, $start = 0, $end = NULL) {
    if($end == NULL) $end = count($arr) - 1;
    $index = floor(($start+$end)/2);
    $base = $arr[$index];
    if($value < $base) return binarysearch($arr, $value, $start, $index-1);
    else if($value > $base) return binarysearch($arr, $value, $index+1, $end);
    else return $index;
    }


    $arr = array(1, 3, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20);
    $value = 8;
    echo binarysearch($arr, $value);

  • 相关阅读:
    Linux启动报错missing operating system
    Linux tmp目录自动清理总结
    ORACLE口令管理
    oom_kill_process造成数据库挂起并出现found dead shared server
    Oracle shutdown immediate遭遇ORA-24324 ORA-24323 ORA-01089
    从flink-example分析flink组件(1)WordCount batch实战及源码分析
    从mysql高可用架构看高可用架构设计
    由mysql分区想到的分表分库的方案
    六边形效果
    迷你MVVM框架 avalonjs1.5.2 发布
  • 原文地址:https://www.cnblogs.com/wicub/p/5325138.html
Copyright © 2020-2023  润新知