PHP常用冒泡,快速排序算法;二分,顺序查找推荐

本文详细介绍了几种常见的排序算法(冒泡排序、快速排序)及查找算法(二分查找、顺序查找),并通过PHP代码实现这些算法,同时展示了如何遍历目录、获取URL扩展名和实现中文字符串截取。

一、冒泡排序

基本思想:

对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

//冒泡排序

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<?php

 

  function mysort($arr)

  {

    for($i = 0; $i < count($arr); $i++)

    {

      $isSort = false;

      for ($j=0; $j< count($arr) - $i - 1; $j++)

      {

        if($arr[$j] < $arr[$j+1])

        {

          $isSort = true;

          $temp = $arr[$j];

          $arr[$j] = $arr[$j+1];

          $arr[$j+1] = $temp ;

        }

      }

      if($isSort)

      {

        break;

      }

    }

    return $arr;

  }

 

  $arr = array(3,1,2);

  var_dump(mysort($arr));

?>

二、快速排序

基本思想:

在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

//快速排序

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<?php

  //快速排序

    function quick_sort($arr)

    {

      //先判断是否需要继续进行

      $length = count($arr);

      if($length <= 1)

      {

        return $arr;

      }

     

      $base_num = $arr[0];//选择一个标尺 选择第一个元素

 

      //初始化两个数组

      $left_array = array();//小于标尺的

      $right_array = array();//大于标尺的

      for($i=1; $i<$length; $i++)

      {      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内

        if($base_num > $arr[$i])

        {

          //放入左边数组

          $left_array[] = $arr[$i];

        }

        else

        {

          //放入右边

          $right_array[] = $arr[$i];

        }

      }

      //再分别对 左边 和 右边的数组进行相同的排序处理方式

      //递归调用这个函数,并记录结果

      $left_array = quick_sort($left_array);

      $right_array = quick_sort($right_array);

      //合并左边 标尺 右边

      return array_merge($left_array, array($base_num), $right_array);

    }

 

    $arr = array(3,1,2);

    var_dump(quick_sort($arr));

 

?>

三、二分查找

基本思想:

假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

//二分查找

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?php

  //二分查找

  function bin_search($arr,$low,$high,$k)

  {

    if($low <= $high)

    {

      $mid = intval(($low + $high)/2);

      if($arr[$mid] == $k)

      {

        return $mid;

      }

      else if($k < $arr[$mid])

      {

        return bin_search($arr,$low,$mid-1,$k);

      }

      else

      {

        return bin_search($arr,$mid+1,$high,$k);

      }

    }

    return -1;

  }

 

  $arr = array(1,2,3,4,5,6,7,8,9,10);

 

  print(bin_search($arr,0,9,3));

?>

四、顺序查找

基本思想:

从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

//顺序查找 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<?php

  //顺序查找

  function seq_search($arr,$n,$k)

  {

    $array[$n] = $k;

    for($i = 0;$i < $n; $i++)

    {

      if($arr[$i] == $k)

      {

        break;

      }

    }

 

    if($i < $n)

    {

      return $i;

    }

    else

    {

      return -1;

    }

  }

?>

五、写一个函数,能够遍历一个文件下的所有文件和子文件夹

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<?php 

  function my_scandir($dir)

  {

    $files = array();

    if($handle = opendir($dir))

    {

      while (($file = readdir($handle))!== false)

      {

        if($file != '..' && $file != '.')

        {

          if(is_dir($dir."/".$file))

          {

            $files[$file]=my_scandir($dir."/".$file);

          }

          else

          {

            $files[] = $file;

          }

        }

      }

 

      closedir($handle);

      return $files;

    }

  }

 

  var_dump(my_scandir('../'));

?>

六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<?php

  function getExt($url)

  {

    $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分

    //'scheme' => string 'http' (length=4)

    //'host' => string 'www.sina.com.cn' (length=15)

    //'path' => string '/abc/de/fg.php' (length=14)

    //'query' => string 'id=1' (length=4)

    $file = basename($arr['path']);// basename函数返回路径中的文件名部分

    $ext = explode('.', $file);

    return $ext[count($ext)-1];

  }

 

  print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));

 

?>

七、实现中文字符串截取无乱码的方法

可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值