数据结构与算法

数据结构:

双向链表

双链表 (DLL) 是一个链接到两个方向的节点列表。当底层结构是 DLL 时, 迭代器的操作、对两端的访问、节点的添加或删除都具有 O (1) 的开销。因此, 它为栈和队列提供了一个合适的实现。

堆是遵循堆属性的树状结构: 每个节点都大于或等于其子级, 使用对堆全局的已实现的比较方法进行比较。

数组

数组是以连续方式存储数据的结构, 可通过索引进行访问。不要将它们与 php 数组混淆: php 数组实际上是按照有序的列表实现的。

映射

映射是一个数据拥有键值对。PHP 数组可以被看作是从整数/字符串到值的映射。SPL 提供了从对象到数据的映射。此映射也可用作对象集。

基本的算法:冒泡排序,快速排序,二分查找,顺序查找(需要能够手写)

下文摘自:http://www.jb51.net/article/89047.htm

冒泡排序:

<?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 ));
?>

快速排序:

<?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 ));
 
?>

二分查找:

<?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));
?>

顺序查找:

<?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;
     }
   }
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值