一些常用的算法 php实现

  1. <?php
  2. $un_sort_array=array();
  3. for($i=0;$i<20;$i++)
  4. {
  5.  $un_sort_array[]=rand(1,9999);
  6. }
  7. //用于二分查找
  8. $need_value = end($un_sort_array);
  9. /* 插入排序
  10. 【基本思想】:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
  11. 【示例】: [初始关键字] 
  12. [49] 38 65 97 76 13 27 49 
  13. J=2(38) [38 49] 65 97 76 13 27 49 
  14. J=3(65) [38 49 65] 97 76 13 27 49 
  15. J=4(97) [38 49 65 97] 76 13 27 49 
  16. J=5(76) [38 49 65 76 97] 13 27 49 
  17. J=6(13) [13 38 49 65 76 97] 27 49 
  18. J=7(27) [13 27 38 49 65 76 97] 49 
  19. J=8(49) [13 27 38 49 49 65 76 97]
  20. */
  21. function insert($un_sort_array)
  22. {
  23.  //$i待移动的元素
  24.  for($i=1;$i<count($un_sort_array);$i++)
  25.  {
  26.   $value = $un_sort_array[$i];
  27.   //$j被插入队列的索引
  28.   $j=$i-1;  
  29.   while($value && $value < $un_sort_array[$j])
  30.   {
  31.      $un_sort_array[$j+1]=$un_sort_array[$j];
  32.      $j--;
  33.      if($j<0)
  34.      break;
  35.   }
  36.   $un_sort_array[$j+1]= $value;
  37.  }
  38.  return $un_sort_array;
  39. }
  40. /*
  41. 【选择排序(一维数组)】【基本思想】:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。【示例】: 
  42. [初始关键字] [49 38 65 97 76 13 27 49] 
  43. 第一趟排序后 13 [38 65 97 76 49 27 49] 
  44. 第二趟排序后 13 27 [65 97 76 49 38 49] 
  45. 第三趟排序后 13 27 38 [97 76 49 65 49] 
  46. 第四趟排序后 13 27 38 49 [49 97 65 76] 
  47. 第五趟排序后 13 27 38 49 49 [97 97 76] 
  48. 第六趟排序后 13 27 38 49 49 76 [76 97] 
  49. 第七趟排序后 13 27 38 49 49 76 76 [ 97] 
  50. 最后排序结果 13 27 38 49 49 76 76 97 */
  51. function select_sort($un_sort_array)
  52. {
  53.  for($i=0;$i<count($un_sort_array)-1;$i++)
  54.  {
  55.   $min_index = $i;
  56.   $value = $un_sort_array[$i];
  57.   for($j=$i+1;$j<count($un_sort_array);$j++)
  58.   {
  59.    if($un_sort_array[$j]<$un_sort_array[$i])
  60.    {
  61.     $un_sort_array[$i] = $un_sort_array[$j];
  62.     $min_index = $j;
  63.    }
  64.   }
  65.   $un_sort_array[$min_index] = $value;
  66.  }
  67.  return $un_sort_array;
  68. }
  69. //select_sort($un_sort_array);
  70. /*
  71. 【冒泡排序】【基本思想】:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。【排序过程】:设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。*/
  72. function ball_sort($un_sort_array)
  73. {
  74.  for($i=0;$i<count($un_sort_array)-1;$i++)
  75.  {
  76.   //$value = $un_sort_array[$i];
  77.   for($j = count($un_sort_array)-1;$j>$i;$j--)
  78.   {
  79.    if($un_sort_array[$j] < $un_sort_array[$j-1])
  80.    {
  81.     $value = $un_sort_array[$j];
  82.     $un_sort_array[$j]= $un_sort_array[$j-1];
  83.     $un_sort_array[$j-1] = $value;
  84.    }
  85.   }
  86.  }
  87.  return $un_sort_array;
  88. }
  89. //print_r(ball_sort($un_sort_array));
  90. /*
  91. 【快速排序(一维数组)】【基本思想】:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I 1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I 1..H](1≤I≤H),当R[1..I-1]和R[I 1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
  92. 【示例】:
  93. 初始关键字 [49 38 65 97 76 13 27 49]
  94. 第一次交换后 [27 38 65 97 76 13 49 49] 
  95. 第二次交换后 [27 38 49 97 76 13 65 49] 
  96. J向左扫描,位置不变,第三次交换后 [27 38 13 97 76 49 65 49] 
  97. I向右扫描,位置不变,第四次交换后 [27 38 13 49 76 97 65 49] 
  98. J向左扫描 [27 38 13 49 76 97 65 49](一次划分过程)
  99. 初始关键字 [49 38 65 97 76 13 27 49]一趟排序之后 [27 38 13] 49 [76 97 65 49] 
  100. 二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
  101. 三趟排序之后 13 27 38 49 49 [65]76 97 
  102. 最后的排序结果 13 27 38 49 49 65 76 97 各趟排序之后的状态 */
  103. //$start 为开始索引,$end为结束索引
  104. function quick_sort($un_sort_array,$start,$end)
  105. {
  106.   $value = $un_sort_array[$start];
  107.   $i=$start+1;
  108.   $j=$end;
  109.   while(1)
  110.   {
  111.    while$un_sort_array[$i]<$value && $i<$j)
  112.     $i++;
  113.    //多一个=号是因为交换的时候,关键字要和小于关键字的部分交换
  114.    while$un_sort_array[$j]>$value && $i<=$j)
  115.     $j--;
  116.    if($i>=$j)
  117.     break;
  118.    $tmp = $un_sort_array[$i];
  119.    $un_sort_array[$i] = $un_sort_array[$j];
  120.    $un_sort_array[$j] = $tmp;
  121.    //print_r($un_sort_array);exit;
  122.   }
  123.   $un_sort_array[$start] = $un_sort_array[$j];
  124.   $un_sort_array[$j] = $value;
  125.   if( ($j-1-$start) >0)
  126.   quick_sort($un_sort_array,$start,$j-1);
  127.   if( ($end-$j-1) >0 )
  128.   quick_sort($un_sort_array,$j+1,$end);
  129. }
  130. quick_sort($un_sort_array,0,19);
  131. //print_r($un_sort_array);
  132. //利用一维数组 递归二分查找法
  133. //将数组$un_sort_array排序后,为升序
  134. function binary_seach($un_sort_array,$start,$end,$need_value)
  135. {
  136.  $mid = intval(($start+$end)/2);
  137.  if($start>$end )
  138.  {
  139.   //未找到或者参数出错
  140.   return false;
  141.  }
  142.  if($need_value>$un_sort_array[$mid])
  143.  {
  144.   return binary_seach($un_sort_array,$mid+1,$end,$need_value);
  145.  }
  146.  else if($need_value<$un_sort_array[$mid])
  147.  {
  148.   return binary_seach($un_sort_array,$start,$mid-1,$need_value);
  149.  }
  150.  else
  151.  {
  152.   return true;
  153.  }
  154. }
  155. //var_dump(binary_seach($un_sort_array,0,19,$need_value));
  156. //二分查找(递归消除)
  157. function binary_seach_clean($un_sort_array,$start,$end$need_value)
  158. {
  159.  while($start <= $end )
  160.  { 
  161.         $mid = intval( ($start+$end)/2 );
  162.         if ($un_sort_array[$mid] == $need_value
  163.             return true; 
  164.         elseif ($need_value < $un_sort_array[$mid])
  165.   { 
  166.             $end = $mid - 1; 
  167.         }
  168.   else
  169.   { 
  170.             $start = $mid + 1; 
  171.         } 
  172.     } 
  173.     return false; 
  174. var_dump(binary_seach_clean($un_sort_array,0,19,$need_value));

最近辞职了 准备早点回家过年,待着实在无聊 就写了一些原来数据结构的算法的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值