<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4604156374423970436</id><updated>2011-11-18T23:05:08.210-08:00</updated><category term='Recursive algorithms'/><category term='Sorting algorithms'/><title type='text'>Iskren Stoyanov's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-8233444347321829523</id><published>2007-11-30T19:50:00.000-08:00</published><updated>2007-11-30T19:56:35.627-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>B-tree - Add element/node</title><content type='html'>Here follows an example of creating "Multiway B-Tree".&lt;br /&gt;&lt;br /&gt;The implementation is in PHP:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;// B-tree&lt;br /&gt;function btree_search( $value, $a, &amp;$higher, $v)&lt;br /&gt;{&lt;br /&gt; global $tree, $q, $u, $n, $nn;&lt;br /&gt; &lt;br /&gt; static $v;&lt;br /&gt; &lt;br /&gt; // create new elelemt&lt;br /&gt; if( $tree[$a]['m'] == 0 )&lt;br /&gt; {&lt;br /&gt;  $higher = true;&lt;br /&gt;  $v['value'] = $value;&lt;br /&gt;  $v['count'] = 1;&lt;br /&gt;  $v['p'] = null;&lt;br /&gt;  &lt;br /&gt;  $u = $v;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;   $cur = $tree[$a];&lt;br /&gt;   $l = 1;&lt;br /&gt;   $r = $cur['m'];&lt;br /&gt;&lt;br /&gt;   do// binary search&lt;br /&gt;   {&lt;br /&gt;    $k = (int)( ($l + $r)/2);&lt;br /&gt;    if( $value &lt;= $cur['el'][$k]['value'] )&lt;br /&gt;    {&lt;br /&gt;     $r = $k - 1;&lt;br /&gt;    }&lt;br /&gt;    if( $value &gt;= $cur['el'][$k]['value'] )&lt;br /&gt;    {&lt;br /&gt;     $l = $k + 1;&lt;br /&gt;    }&lt;br /&gt;   }while( $r &gt;= $l);&lt;br /&gt;&lt;br /&gt;   // found&lt;br /&gt;   if( $l - $r &gt; 1)&lt;br /&gt;   {&lt;br /&gt;    $cur['el'][$k]['count']++;&lt;br /&gt;    $higher = false;&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    if( $r == 0 )&lt;br /&gt;     $q = $cur['p0'];&lt;br /&gt;    else&lt;br /&gt;     $q = $cur['el'][$r]['p'];&lt;br /&gt;    &lt;br /&gt;    btree_search($value, $q, $higher, $u);&lt;br /&gt;    if( $higher )&lt;br /&gt;    {&lt;br /&gt;     /* $a !== null. Search key $value in B-tree with root $a;&lt;br /&gt;       insert new item with key $value. If an entry is to be passed up,&lt;br /&gt;       assign it to $v. $higher = "tree has become higher"&lt;br /&gt;    */&lt;br /&gt;     &lt;br /&gt;     $cur = &amp;$tree[$a];&lt;br /&gt;    &lt;br /&gt;     // !$higher&lt;br /&gt;    if( $cur['m'] &lt; $n*2 )&lt;br /&gt;    {&lt;br /&gt;     $cur['m']++;&lt;br /&gt;     $higher = false;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;     for( $i=$cur['m']; $i &gt;= $r+2; $i-- )&lt;br /&gt;     {&lt;br /&gt;      $cur['el'][$i] = $cur['el'][$i-1];&lt;br /&gt;      &lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;     $cur['el'][$r+1] = $u;&lt;br /&gt;     &lt;br /&gt;    }&lt;br /&gt;    // page $tree[$a]/$cur is full.&lt;br /&gt;    // It's partioned and the odd element is moved to v &lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     // add new element to $tree and assign&lt;br /&gt;     // the last element's num to $b;&lt;br /&gt;     $b = array_push($tree, array());&lt;br /&gt;     if( $r &lt;= $n ) // insert in left page $a&lt;br /&gt;     {&lt;br /&gt;      if( $r == $n )&lt;br /&gt;       $v = $u;&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;       $v = $cur['el'][$n];&lt;br /&gt;       for( $i=$n; $i &gt;= $r+2; $i-- )&lt;br /&gt;        $cur['el'][$i] = $cur['el'][$i-1];&lt;br /&gt;       &lt;br /&gt;       $cur['el'][$r+1] = $u;&lt;br /&gt;      }&lt;br /&gt;      for( $i=1; $i &lt;= $n; $i++ ){&lt;br /&gt;       $tree[$b]['el'][$i] = $cur['el'][$i+$n];&lt;br /&gt;       unset( $cur['el'][$i+$n] );&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;     else // insert into right page $b&lt;br /&gt;     {&lt;br /&gt;      $r = $r-$n;&lt;br /&gt;      $v = $cur['el'][$n+1];&lt;br /&gt;      for( $i=1; $i &lt;= $r-1; $i++ )&lt;br /&gt;       $tree[$b]['el'][$i] = $cur['el'][$i+$n+1];&lt;br /&gt;      $tree[$b]['el'][$r] = $u;&lt;br /&gt;       &lt;br /&gt;      for( $i=$r+1; $i &lt;= $n; $i++ )&lt;br /&gt;       $tree[$b]['el'][$i] = $cur['el'][$i+$n];&lt;br /&gt;      &lt;br /&gt;     }&lt;br /&gt;     $cur['m'] = $n;&lt;br /&gt;     $tree[$b]['m'] = $n;&lt;br /&gt;     $tree[$b]['p0'] = $v['p'];&lt;br /&gt;     $v['p'] = $b;&lt;br /&gt;     &lt;br /&gt;     $u = $v;&lt;br /&gt;    }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$b_tree = array();&lt;br /&gt;// you could create as many trees as you want&lt;br /&gt;// but when you want to work with them use $tree = &amp;$my_tree;&lt;br /&gt;$tree = &amp;$b_tree;&lt;br /&gt;// array for B-tree insert test&lt;br /&gt;// test steps bellow to see how the tree behaves &lt;br /&gt;$values = array(20);&lt;br /&gt;//$values = array(20, 40, 10, 30,15);&lt;br /&gt;//$values = array(20, 40, 10, 30,15, 35, 7, 26, 18, 22);&lt;br /&gt;//$values = array(20, 40, 10, 30,15, 35, 7, 26, 18, 22, 5);&lt;br /&gt;//$values = array(20, 40, 10, 30,15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27, 8, 32);&lt;br /&gt;//$values = array(20, 40, 10, 30,15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27, 8, 32, 38, 24, 45, 25 );&lt;br /&gt;&lt;br /&gt;$higher = false;&lt;br /&gt;$root = null;&lt;br /&gt;$n = 2;&lt;br /&gt;foreach( $values as $val )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; btree_search( $val, $root, $higher, $u);&lt;br /&gt; if( $higher )&lt;br /&gt; {&lt;br /&gt;  $q = $root;&lt;br /&gt;  if( count($tree) == 0 )&lt;br /&gt;  {&lt;br /&gt;   $tree = array(1=&gt;array());&lt;br /&gt;   $root = 1;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;   $root = array_push($tree, array());&lt;br /&gt;&lt;br /&gt;  $tree[$root]['m'] = 1;&lt;br /&gt;  $tree[$root]['p0'] = $q;&lt;br /&gt;  &lt;br /&gt;  $tree[$root]['el'][1] = $u;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-8233444347321829523?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/8233444347321829523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=8233444347321829523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/8233444347321829523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/8233444347321829523'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/b-tree-add-elementnode.html' title='B-tree - Add element/node'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-4747324487412189082</id><published>2007-11-30T19:49:00.000-08:00</published><updated>2007-11-30T19:55:05.424-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>B-tree - Remove element/node</title><content type='html'>Here follows an example of deleting from "Multiway B-Tree".&lt;br /&gt;&lt;br /&gt;PHP code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function btree_delete($value, $a, &amp;$higher)&lt;br /&gt;{&lt;br /&gt; /*  search and delete key $value in B-tree a; if a page underflow arises,&lt;br /&gt;  balance with adjacent page or merge; $higher := "page $a is undersize" */&lt;br /&gt; &lt;br /&gt; global $tree, $n;&lt;br /&gt; &lt;br /&gt; if( $a === null )&lt;br /&gt; {&lt;br /&gt;  $higher = false;&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  $l = 1;&lt;br /&gt;  $r = $tree[$a]['m'];&lt;br /&gt;  &lt;br /&gt;  // binary search&lt;br /&gt;  do&lt;br /&gt;  {&lt;br /&gt;   $k = (int)( ($l + $r)/2 );&lt;br /&gt;   if( $value &lt;= $tree[$a]['el'][$k]['value'] )&lt;br /&gt;    $r = $k -1;&lt;br /&gt;   if( $value &gt;= $tree[$a]['el'][$k]['value'] )&lt;br /&gt;    $l = $k +1;&lt;br /&gt;  }while( $r &gt;= $l );&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  if( $r === 0 )&lt;br /&gt;  {&lt;br /&gt;   $q = $tree[$a]['p0']; // go to the left&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;   $q = $tree[$a]['el'][$r]['p']; // go to the right&lt;br /&gt;   &lt;br /&gt;  if( $l - $r &gt; 1)&lt;br /&gt;  {&lt;br /&gt;   // $a is leaf page&lt;br /&gt;   if( $q === null )&lt;br /&gt;   {&lt;br /&gt;    $tree[$a]['m']--;&lt;br /&gt;    $higher = ($tree[$a]['m'] &lt; $n )? true: false;&lt;br /&gt;    &lt;br /&gt;    for( $i=$k; $i &lt;= $tree[$a]['m']; $i++ )&lt;br /&gt;    {&lt;br /&gt;     $tree[$a]['el'][$i] = $tree[$a]['el'][$i+1];&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    btree_del($q,$a, $higher, $k);&lt;br /&gt;    if( $higher )&lt;br /&gt;    {&lt;br /&gt;     underflow( $a , $q, $r, $higher, $k); &lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   btree_delete( $value, $q, $higher );&lt;br /&gt;   if( $higher )&lt;br /&gt;   {&lt;br /&gt;    underflow( $a, $q, $r, $higher, $k );&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function underflow( $c, $a, $s, &amp;$higher, &amp;$k )&lt;br /&gt;{&lt;br /&gt; /* $a = underflowing page, $c = ancestor page,&lt;br /&gt;  $s = index of deleted entry in c */&lt;br /&gt; &lt;br /&gt; global $tree, $n;&lt;br /&gt; &lt;br /&gt; $mc = $tree[$c]['m'];&lt;br /&gt; &lt;br /&gt; if( $s &lt; $mc ) &lt;br /&gt; {&lt;br /&gt;  $s++;&lt;br /&gt;  &lt;br /&gt;  // $b = page to the right of a&lt;br /&gt;  $b = $tree[$c]['el'][$s]['p'];&lt;br /&gt;  $mb = $tree[$b]['m'];&lt;br /&gt;  &lt;br /&gt;  // $k = nof items available on page b&lt;br /&gt;  $k = (int)( ($mb - $n+1)/2 );&lt;br /&gt;  &lt;br /&gt;  $tree[$a]['el'][$n] = $tree[$c]['el'][$s];&lt;br /&gt;  &lt;br /&gt;  $tree[$a]['el'][$n]['p'] = $tree[$b]['p0'];&lt;br /&gt;&lt;br /&gt;  if( $k &gt; 0 )// balance by moving k-1 items from $b to $a&lt;br /&gt;  {&lt;br /&gt;   for( $i=1; $i &lt;= $k-1; $i++ )&lt;br /&gt;   {&lt;br /&gt;    $tree[$a]['el'][$i+$n] = $tree[$b]['el'][$i];&lt;br /&gt;   }&lt;br /&gt;   $tree[$c]['el'][$s] = $tree[$b]['el'][$k];&lt;br /&gt;   $tree[$c]['el'][$s]['p'] = $b;&lt;br /&gt;   &lt;br /&gt;   $tree[$b]['p0'] = $tree[$b]['el'][$k]['p'];&lt;br /&gt;   $mb -= $k;/////// +1&lt;br /&gt;   &lt;br /&gt;   for( $i=1; $i &lt;= $mb; $i++  )&lt;br /&gt;   {&lt;br /&gt;    $tree[$b]['el'][$i] = $tree[$b]['el'][$i+$k];&lt;br /&gt;   }&lt;br /&gt;   $tree[$b]['m'] = $mb;&lt;br /&gt;   $tree[$a]['m'] = $n-1 +$k;&lt;br /&gt;   $higher = false;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;  else// merging a and b, discard b&lt;br /&gt;  {&lt;br /&gt;   for( $i=1; $i &lt;= $n; $i++ )&lt;br /&gt;   {&lt;br /&gt;    $tree[$a]['el'][$i+$n] = $tree[$b]['el'][$i];&lt;br /&gt;   }&lt;br /&gt;   for( $i=$s; $i &lt;= $mc-1; $i++)&lt;br /&gt;   {&lt;br /&gt;    $tree[$c]['el'][$i] = $tree[$c]['el'][$i+1];&lt;br /&gt;   }&lt;br /&gt;   $tree[$a]['m'] = 2*$n;&lt;br /&gt;   $tree[$c]['m'] = $mc - 1;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  // $b = page to the left of $a&lt;br /&gt;  if( $s == 1 )&lt;br /&gt;  {&lt;br /&gt;   $b = $tree[$c]['p0'];&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   $b = $tree[$c]['el'][$s-1]['p'];&lt;br /&gt;  }&lt;br /&gt;  $mb = $tree[$b]['m']+1;&lt;br /&gt;  $k = (int)( ($mb - $n)/2 );&lt;br /&gt;  &lt;br /&gt;  if( $k &gt; 0 )&lt;br /&gt;  {&lt;br /&gt;   for( $i=$n-1; $i &gt;= 1; $i-- )&lt;br /&gt;   {&lt;br /&gt;    $tree[$a]['el'][$i+$k] = $tree[$a]['el'][$i]; &lt;br /&gt;   }&lt;br /&gt;   $tree[$a]['el'][$k] = $tree[$c]['el'][$s];&lt;br /&gt;   $tree[$a]['el'][$k]['p'] = $tree[$a]['p0'];&lt;br /&gt;&lt;br /&gt;   // move k-1 items from $b to $a, one to $c&lt;br /&gt;&lt;br /&gt;   $mb -= $k;//////// +1&lt;br /&gt;   &lt;br /&gt;   for( $i=$k-1; $i &gt;= 1; $i-- )&lt;br /&gt;   {&lt;br /&gt;    $tree[$a]['el'][$i] = $tree[$b]['el'][$i+$mb]; &lt;br /&gt;   }&lt;br /&gt;   $tree[$a]['p0'] = $tree[$b]['el'][$mb]['p'];&lt;br /&gt;   &lt;br /&gt;   $tree[$c]['el'][$s] = $tree[$b]['el'][$mb];&lt;br /&gt;   $tree[$c]['el'][$s]['p'] = $a;&lt;br /&gt;   &lt;br /&gt;   $tree[$b]['m'] = $mb -1;&lt;br /&gt;   $tree[$a]['m'] = $n-1 +$k;&lt;br /&gt;&lt;br /&gt;   $higher = false;&lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt;  else //merge pages $a and $b, discard $a&lt;br /&gt;  {&lt;br /&gt;   $tree[$b]['el'][$mb] = $tree[$c]['el'][$s];&lt;br /&gt;   $tree[$b]['el'][$mb]['p'] = $tree[$a]['p0'];&lt;br /&gt;   &lt;br /&gt;   for( $i=1; $i &lt;= $n-1; $i++ )&lt;br /&gt;   {&lt;br /&gt;    $tree[$b]['el'][$i+$mb] = $tree[$a]['el'][$i];&lt;br /&gt;   }&lt;br /&gt;   $tree[$b]['m'] = 2*$n;&lt;br /&gt;   $tree[$c]['m'] = $mc - 1;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function btree_del($p, $a, &amp;$higher, &amp;$k)&lt;br /&gt;{&lt;br /&gt; global $tree, $n;&lt;br /&gt; &lt;br /&gt; $m = &amp;$tree[$p]['m'];&lt;br /&gt; &lt;br /&gt; $q = $tree[$p]['el'][$m]['p'];&lt;br /&gt; if( $q !== null )&lt;br /&gt; {&lt;br /&gt;  btree_del($q, $a, $higher, $k);&lt;br /&gt;  if( $higher )&lt;br /&gt;   underflow($p, $q, $m, $higher, $k);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  $tree[$p]['el'][$m]['p'] = $tree[$a]['el'][$k]['p'];&lt;br /&gt;  $tree[$a]['el'][$k] = $tree[$p]['el'][$m];&lt;br /&gt;  &lt;br /&gt;  $m--;&lt;br /&gt;&lt;br /&gt;  $higher = ($m &lt; $n )? true: false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Full example of creating and delete from B-Tree &lt;a href="http://iskren.biz/src/trees.sphp"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-4747324487412189082?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/4747324487412189082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=4747324487412189082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4747324487412189082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4747324487412189082'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/b-tree-remove-elementnode.html' title='B-tree - Remove element/node'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-3815840993353888816</id><published>2007-11-26T15:58:00.000-08:00</published><updated>2007-11-30T19:57:26.355-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>Balanced tree - Add element/node</title><content type='html'>This script add element to the tree if it doesn't exist, if exists just increment it counter.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function search_btree( $value, $ptr, $higher, $ptr0 = 0,$node = 'left' )&lt;br /&gt;{&lt;br /&gt; global $tree;&lt;br /&gt; static &lt;br /&gt;  $first_run = 1,&lt;br /&gt;  $higher,&lt;br /&gt;  $beginning;  &lt;br /&gt; &lt;br /&gt; if( !$tree[$ptr]['value'] )// insertion&lt;br /&gt; {&lt;br /&gt;  if( !$first_run )// create new element in the tree array - $tree&lt;br /&gt;  {&lt;br /&gt;   $tree[] = array();&lt;br /&gt;   $ptr = count($tree)-1;&lt;br /&gt;    &lt;br /&gt;   $tree[$ptr0][$node] = $ptr;// put current node in parent's left or right node&lt;br /&gt;&lt;br /&gt;  }else{// $tree[0] is already create so we just use is&lt;br /&gt;   $first_run--;&lt;br /&gt;   $beginning = $ptr;&lt;br /&gt;  }&lt;br /&gt;  $higher = true;&lt;br /&gt;  &lt;br /&gt;  $tree[$ptr]['value'] = $value;&lt;br /&gt;  $tree[$ptr]['left'] = null;&lt;br /&gt;  $tree[$ptr]['right'] = null;&lt;br /&gt;  $tree[$ptr]['bal'] = 0;&lt;br /&gt;  $tree[$ptr]['count'] = 1;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  if( $value &lt; $tree[$ptr]['value'] )&lt;br /&gt;  {&lt;br /&gt;   search_btree( $value, $tree[$ptr]['left'], $higher, $ptr );&lt;br /&gt;   if( $higher )&lt;br /&gt;   {&lt;br /&gt;    switch( $tree[$ptr]['bal'] )&lt;br /&gt;    {&lt;br /&gt;     case 1:&lt;br /&gt;      $tree[$ptr]['bal'] = 0;&lt;br /&gt;      $higher = false;&lt;br /&gt;     break;&lt;br /&gt;     case 0:&lt;br /&gt;      $tree[$ptr]['bal'] = -1;&lt;br /&gt;     break;&lt;br /&gt;     case -1:&lt;br /&gt;      $ptr1 = $tree[$ptr]['left'];&lt;br /&gt;      if( $tree[$ptr1]['bal'] == -1) // individualli flip LL&lt;br /&gt;      {&lt;br /&gt;       &lt;br /&gt;       $tree[$ptr]['left'] = $tree[$ptr1]['right'];&lt;br /&gt;       $tree[$ptr1]['right'] = $ptr;&lt;br /&gt;       $tree[$ptr]['bal'] = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       if( $ptr == $beginning )&lt;br /&gt;        $beginning = $ptr1;&lt;br /&gt;       // replaces $ptr with $ptr1 in parent left or right node&lt;br /&gt;       replace_pointer_link( $ptr, $ptr1 );&lt;br /&gt;       $ptr = $ptr1;&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;       $ptr2 = $tree[$ptr1]['right'];&lt;br /&gt;&lt;br /&gt;       $tree[$ptr1]['right'] = $tree[$ptr2]['left'];&lt;br /&gt;       $tree[$ptr2]['left'] = $ptr1;&lt;br /&gt;       &lt;br /&gt;       $tree[$ptr]['left'] = $tree[$ptr2]['right'];&lt;br /&gt;       $tree[$ptr2]['right'] = $ptr;&lt;br /&gt;       &lt;br /&gt;       if( $tree[$ptr2]['bal'] == -1 )&lt;br /&gt;        $tree[$ptr]['bal'] = 1;&lt;br /&gt;       else&lt;br /&gt;        $tree[$ptr]['bal'] = 0;&lt;br /&gt;        &lt;br /&gt;       if( $tree[$ptr2]['bal'] == 1 )&lt;br /&gt;        $tree[$ptr1]['bal'] = -1;&lt;br /&gt;       else&lt;br /&gt;        $tree[$ptr1]['bal'] = 0;&lt;br /&gt;       &lt;br /&gt;       if( $ptr == $beginning )&lt;br /&gt;        $beginning = $ptr2;&lt;br /&gt;       replace_pointer_link( $ptr, $ptr2 );&lt;br /&gt;       $ptr = $ptr2;&lt;br /&gt;       &lt;br /&gt;      }&lt;br /&gt;      $tree[$ptr]['bal'] = 0;&lt;br /&gt;      $higher = false;&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  else if( $value &gt; $tree[$ptr]['value'] )&lt;br /&gt;  {&lt;br /&gt;   search_btree( $value, $tree[$ptr]['right'], $higher, $ptr, 'right' );&lt;br /&gt;   if( $higher )&lt;br /&gt;   {&lt;br /&gt;    switch( $tree[$ptr]['bal'] )&lt;br /&gt;    {&lt;br /&gt;     case -1:&lt;br /&gt;      $tree[$ptr]['bal'] = 0;&lt;br /&gt;      $higher = false;&lt;br /&gt;     break;&lt;br /&gt;     case 0:&lt;br /&gt;      $tree[$ptr]['bal'] = 1;&lt;br /&gt;     break;&lt;br /&gt;     case 1:&lt;br /&gt;      $ptr1 = $tree[$ptr]['right'];&lt;br /&gt;      if( $tree[$ptr1]['bal'] == 1 )// individualli flip RR&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;       $tree[$ptr]['right'] = $tree[$ptr1]['left'];&lt;br /&gt;       $tree[$ptr1]['left'] = $ptr;&lt;br /&gt;       &lt;br /&gt;       $tree[$ptr]['bal'] = 0;&lt;br /&gt;       &lt;br /&gt;       if( $ptr == $beginning )&lt;br /&gt;        $beginning = $ptr1;&lt;br /&gt;       replace_pointer_link( $ptr, $ptr1 );&lt;br /&gt;       $ptr = $ptr1;&lt;br /&gt;      }&lt;br /&gt;      else//RL&lt;br /&gt;      {&lt;br /&gt;       &lt;br /&gt;       $ptr2 = $tree[$ptr1]['left'];&lt;br /&gt;       &lt;br /&gt;       $tree[$ptr1]['left'] = $tree[$ptr2]['right'];&lt;br /&gt;       $tree[$ptr2]['right'] = $ptr1;&lt;br /&gt;       &lt;br /&gt;       $tree[$ptr]['right'] = $tree[$ptr2]['left'];&lt;br /&gt;       $tree[$ptr2]['left'] = $ptr;&lt;br /&gt;       &lt;br /&gt;       if( $tree[$ptr2]['bal'] == 1 )&lt;br /&gt;        $tree[$ptr]['bal'] = -1;&lt;br /&gt;       else&lt;br /&gt;        $tree[$ptr]['bal'] = 0;&lt;br /&gt;       &lt;br /&gt;       if( $tree[$ptr2]['bal'] == -1 )&lt;br /&gt;        $tree[$ptr1]['bal'] = 1;&lt;br /&gt;       else&lt;br /&gt;        $tree[$ptr1]['bal'] = 0;&lt;br /&gt;       &lt;br /&gt;       if( $ptr == $beginning )&lt;br /&gt;        $beginning = $ptr2;&lt;br /&gt;&lt;br /&gt;       replace_pointer_link( $ptr, $ptr2 );&lt;br /&gt;       $ptr = $ptr2;&lt;br /&gt;      }&lt;br /&gt;      $tree[$ptr]['bal'] = 0;&lt;br /&gt;      $higher = false;&lt;br /&gt;     break;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   $tree[$ptr]['count']++;&lt;br /&gt;   $higher = false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return $beginning;&lt;br /&gt;}&lt;br /&gt;//replaces $old_ptr with $new_ptr in the parent node's left or right node&lt;br /&gt;function replace_pointer_link( $old_ptr, $new_ptr )&lt;br /&gt;{&lt;br /&gt; global $tree;&lt;br /&gt;&lt;br /&gt; for( $i=0; $i &lt; count($tree); $i++)&lt;br /&gt; {&lt;br /&gt;  if( $i === $new_ptr )&lt;br /&gt;   continue;//prevents replacing $old_ptr with $new_ptr in $tree[$new_ptr] &lt;br /&gt; &lt;br /&gt;  // if $tree[$i]['left'] is empty and we are checking for link to node 0($old_ptr=0),&lt;br /&gt;  // ('' == 0)==true, but ('' === 0)==false&lt;br /&gt;  // we don't need to put link to node 0 on empty nodes&lt;br /&gt;  if( $tree[$i]['left'] === $old_ptr ){&lt;br /&gt;   $tree[$i]['left'] = $new_ptr;&lt;br /&gt;   return;&lt;br /&gt;   }&lt;br /&gt;   elseif( $tree[$i]['right'] === $old_ptr)&lt;br /&gt;  {&lt;br /&gt;   $tree[$i]['right'] = $new_ptr;&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;//&lt;br /&gt;// Example:&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;$my_tree = array();&lt;br /&gt;// you could create as many trees as you want&lt;br /&gt;// but when you want to work with them use $tree = &amp;$my_tree;&lt;br /&gt;$tree = &amp;$my_tree;&lt;br /&gt;$start = 0;&lt;br /&gt;&lt;br /&gt;// test all 4 cases of rebalancing when&lt;br /&gt;// adding element in balanced tree&lt;br /&gt;$values = array( 4, 5, 7, 2, 1, 3, 6);&lt;br /&gt;foreach( $values as $val )&lt;br /&gt;{&lt;br /&gt; $start = search_btree( $val, $start, false);&lt;br /&gt;}&lt;br /&gt;echo "&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;";&lt;br /&gt;echo "start=$start;";&lt;br /&gt;echo "&amp;lt;pre&amp;gt;";&lt;br /&gt;print_r( $my_tree );&lt;br /&gt;echo "&amp;lt;/pre&amp;gt;";&lt;br /&gt;echo "&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;";&lt;br /&gt;echo "&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;";&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://iskren.biz/src/trees.sphp"&gt;Source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-3815840993353888816?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/3815840993353888816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=3815840993353888816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/3815840993353888816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/3815840993353888816'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/balanced-tree-add-element.html' title='Balanced tree - Add element/node'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-8615651998578496930</id><published>2007-11-26T15:55:00.000-08:00</published><updated>2007-11-26T16:18:17.042-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>Balanced tree - Remove element/node</title><content type='html'>Delete element from balanced tree:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;//replaces $old_ptr with $new_ptr in the parent node's left or right node&lt;br /&gt;function replace_pointer_link( $old_ptr, $new_ptr )&lt;br /&gt;{&lt;br /&gt; global $tree;&lt;br /&gt;&lt;br /&gt; for( $i=0; $i &lt; count($tree); $i++)&lt;br /&gt; {&lt;br /&gt;  if( $i === $new_ptr )&lt;br /&gt;   continue;//prevents replacing $old_ptr with $new_ptr in $tree[$new_ptr] &lt;br /&gt; &lt;br /&gt;  // if $tree[$i]['left'] is empty and we are checking for link to node 0($old_ptr=0),&lt;br /&gt;  // ('' == 0)==true, but ('' === 0)==false&lt;br /&gt;  // we don't need to put link to node 0 on empty nodes&lt;br /&gt;  if( $tree[$i]['left'] === $old_ptr ){&lt;br /&gt;   $tree[$i]['left'] = $new_ptr;&lt;br /&gt;   return;&lt;br /&gt;   }&lt;br /&gt;   elseif( $tree[$i]['right'] === $old_ptr)&lt;br /&gt;  {&lt;br /&gt;   $tree[$i]['right'] = $new_ptr;&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;function delete( $value, $ptr, $higher)&lt;br /&gt;{&lt;br /&gt; global $tree, $q, $start;&lt;br /&gt; static $higher;&lt;br /&gt; &lt;br /&gt; if( !$tree[$ptr]['value'] )&lt;br /&gt; {&lt;br /&gt;  echo "KEY IS NOT IN TREE";&lt;br /&gt;  $higher = false;&lt;br /&gt; }&lt;br /&gt; elseif( $value &lt; $tree[$ptr]['value'] )&lt;br /&gt; {&lt;br /&gt;  delete( $value, $tree[$ptr]['left'], $higher );&lt;br /&gt;  if( $higher )&lt;br /&gt;   balance1( $ptr, $higher);&lt;br /&gt; }&lt;br /&gt; elseif ( $value &gt; $tree[$ptr]['value'] )&lt;br /&gt; {&lt;br /&gt; delete( $value, $tree[$ptr]['right'], $higher );&lt;br /&gt;  if( $higher )&lt;br /&gt;   balance2( $ptr, $higher);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  $q = $ptr;&lt;br /&gt;  if( $tree[$q]['right'] === null )&lt;br /&gt;  {&lt;br /&gt;   replace_pointer_link( $ptr, $tree[$q]['left'] );&lt;br /&gt;   unset($tree[$q]);&lt;br /&gt;   $higher = true; &lt;br /&gt;  }&lt;br /&gt;  elseif( $tree[$q]['left'] === null )&lt;br /&gt;  {&lt;br /&gt;   replace_pointer_link( $ptr, $tree[$q]['right']);&lt;br /&gt;   unset($tree[$q]);&lt;br /&gt;   $higher = true;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   del( $tree[$q]['left'], $higher );&lt;br /&gt;   if( $higher )&lt;br /&gt;    balance1( $ptr, $higher);&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;function balance1( $ptr, &amp;$higher)&lt;br /&gt;{&lt;br /&gt; global $tree, $start;&lt;br /&gt; switch( $tree[$ptr]['bal'] ){&lt;br /&gt;  case -1: &lt;br /&gt;   $tree[$ptr]['bal'] = 0;// after del tree is balanced&lt;br /&gt;  break;&lt;br /&gt;  case 0://after deletion tree is higher in the right side&lt;br /&gt;   $tree[$ptr]['bal'] = 1;&lt;br /&gt;   $higher = false;&lt;br /&gt;  break;&lt;br /&gt;  case 1: // tree must be rebalanced&lt;br /&gt;   $ptr1 = $tree[$ptr]['right'];&lt;br /&gt;   $bal1 = $tree[$ptr1]['bal'];&lt;br /&gt;   &lt;br /&gt;   if( $bal1 &gt;= 0 )// single flip RR&lt;br /&gt;   {&lt;br /&gt;    $tree[$ptr]['right'] = $tree[$ptr1]['left'];&lt;br /&gt;    $tree[$ptr1]['left'] = $ptr;&lt;br /&gt;    &lt;br /&gt;    if( $bal1 == 0 )&lt;br /&gt;    {&lt;br /&gt;     $tree[$ptr]['bal'] = 1;&lt;br /&gt;     $tree[$ptr1]['bal'] = -1;&lt;br /&gt;     $higher = false;&lt;br /&gt;    }else{&lt;br /&gt;     $tree[$ptr]['bal'] = 0;&lt;br /&gt;     $tree[$ptr1]['bal'] = 0;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // start pointer is replaced we need to change $start&lt;br /&gt;    if( $ptr == $start )&lt;br /&gt;     $start = $ptr1;&lt;br /&gt;    replace_pointer_link($ptr, $ptr1);&lt;br /&gt;   }&lt;br /&gt;   else // double flip RL&lt;br /&gt;   {&lt;br /&gt;    $ptr2 = $tree[$ptr1]['left'];&lt;br /&gt;    $bal2 = $tree[$ptr2]['bal'];&lt;br /&gt;    &lt;br /&gt;    $tree[$ptr1]['left'] = $tree[$ptr2]['right'];&lt;br /&gt;    $tree[$ptr2]['right'] = $ptr1;&lt;br /&gt;    &lt;br /&gt;    $tree[$ptr]['right'] = $tree[$ptr2]['left'];&lt;br /&gt;    $tree[$ptr2]['left'] = $ptr;&lt;br /&gt;    &lt;br /&gt;    if( $bal2 == 1 )&lt;br /&gt;    {&lt;br /&gt;     $tree[$ptr]['bal'] = -1;&lt;br /&gt;    }else{&lt;br /&gt;     $tree[$ptr]['bal'] = 0;&lt;br /&gt;    }&lt;br /&gt;    if( $bal2 == -1 )&lt;br /&gt;    {&lt;br /&gt;     $tree[$ptr1]['bal'] = 1;&lt;br /&gt;    }else{&lt;br /&gt;     $tree[$ptr1]['bal'] = 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if( $ptr == $start )&lt;br /&gt;     $start = $ptr2;&lt;br /&gt;    replace_pointer_link( $ptr, $ptr2);&lt;br /&gt;    $tree[$ptr2]['bal'] = 0;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function balance2( $ptr, &amp;$higher )&lt;br /&gt;{&lt;br /&gt; global $tree, $start;&lt;br /&gt; switch( $tree[$ptr]['bal'] )&lt;br /&gt; {&lt;br /&gt;  case 1:&lt;br /&gt;   $tree[$ptr]['bal'] = 0;&lt;br /&gt;  break;&lt;br /&gt;  case 0:&lt;br /&gt;   $tree[$ptr]['bal'] =-1;&lt;br /&gt;   $higher = false;&lt;br /&gt;  break;&lt;br /&gt;  case -1:&lt;br /&gt;   $ptr1 = $tree[$ptr]['left'];&lt;br /&gt;   $bal1 = $tree[$ptr1]['bal'];&lt;br /&gt;   &lt;br /&gt;   if( $bal1 &lt;= 0 )// single flip LL&lt;br /&gt;   {&lt;br /&gt;    $tree[$ptr]['left'] = $tree[$ptr1]['right'];&lt;br /&gt;    $tree[$ptr1]['right'] = $ptr;&lt;br /&gt;    &lt;br /&gt;    if( $bal1 == 0 )&lt;br /&gt;    {&lt;br /&gt;     $tree[$ptr]['bal'] = -1;&lt;br /&gt;     $tree[$ptr1]['bal'] = 1;&lt;br /&gt;     $higher = false;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     $tree[$ptr]['bal'] = 0;&lt;br /&gt;     $tree[$ptr1]['bal'] = 0;&lt;br /&gt;    }&lt;br /&gt;    if( $ptr == $start )&lt;br /&gt;     $start = $ptr1;&lt;br /&gt;    replace_pointer_link( $ptr, $ptr1);&lt;br /&gt;   }&lt;br /&gt;   else// double flip LR &lt;br /&gt;   {&lt;br /&gt;    $ptr2 = $tree[$ptr1]['right'];&lt;br /&gt;    $bal2 = $tree[$ptr2]['bal'];&lt;br /&gt;    &lt;br /&gt;    $tree[$ptr1]['right'] = $tree[$ptr2]['left'];&lt;br /&gt;    $tree[$ptr2]['left'] = $ptr1;&lt;br /&gt;    &lt;br /&gt;    $tree[$ptr]['left'] = $tree[$ptr2]['right'];&lt;br /&gt;    $tree[$ptr2]['right'] = $ptr;&lt;br /&gt;    &lt;br /&gt;    if( $bal2 == -1 )&lt;br /&gt;     $tree[$ptr]['bal'] = 1;&lt;br /&gt;    else&lt;br /&gt;     $tree[$ptr]['bal'] = 0;&lt;br /&gt;    if( $bal2 == 1 )&lt;br /&gt;     $tree[$ptr1]['bal'] = -1;&lt;br /&gt;    else&lt;br /&gt;     $tree[$ptr1]['bal'] = 0;&lt;br /&gt;    &lt;br /&gt;    if( $ptr == $start )&lt;br /&gt;     $start = $ptr2;&lt;br /&gt;    replace_pointer_link($ptr, $ptr2);&lt;br /&gt;    $tree[$ptr2]['bal'] = 0;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function del( $ptr, &amp;$higher )&lt;br /&gt;{&lt;br /&gt; global $tree, $q;&lt;br /&gt; if( $tree[$ptr]['right'] )&lt;br /&gt; {&lt;br /&gt;  del( $tree[$ptr]['right'], $higher);&lt;br /&gt;  if( $higher )&lt;br /&gt;   balance2( $ptr, $higher);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  $tree[$q]['value'] = $tree[$ptr]['value'];&lt;br /&gt;  $tree[$q]['count'] = $tree[$ptr]['count'];&lt;br /&gt;  &lt;br /&gt;  replace_pointer_link($ptr, $tree[$ptr]['left']);&lt;br /&gt;  if( $ptr == $start )&lt;br /&gt;   $start = $tree[$ptr]['left'];&lt;br /&gt;&lt;br /&gt;  unset($tree[$ptr]);&lt;br /&gt;  $higher = true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;$my_tree = array();&lt;br /&gt;// you could create as many trees as you want&lt;br /&gt;// but when you want to work with them use $tree = &amp;$my_tree;&lt;br /&gt;$tree = &amp;$my_tree;&lt;br /&gt;$start = 0;&lt;br /&gt;&lt;br /&gt;// array for testing deletion in balanced tree &lt;br /&gt;$values = array(5, 3, 8, 2, 4, 7, 10, 1, 6, 9, 11);&lt;br /&gt;&lt;br /&gt;foreach( $values as $val )&lt;br /&gt;{&lt;br /&gt; $start = search_btree( $val, $start, false);&lt;br /&gt;}&lt;br /&gt;echo "&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;";&lt;br /&gt;echo "start=$start;";&lt;br /&gt;echo "&amp;lt;pre&amp;gt;";&lt;br /&gt;print_r( $my_tree );&lt;br /&gt;&lt;br /&gt;delete( 4, $start, false);&lt;br /&gt;delete( 8, $start, false);&lt;br /&gt;delete( 6, $start, false);&lt;br /&gt;delete( 5, $start, false);&lt;br /&gt;delete( 2, $start, false);&lt;br /&gt;delete( 1, $start, false);&lt;br /&gt;delete( 7, $start, false);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;echo "start=$start&amp;lt;br&amp;gt;";&lt;br /&gt;print_r($tree);&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;/pre&amp;gt;";&lt;br /&gt;echo "&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;";&lt;br /&gt;echo "&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://iskren.biz/src/trees.sphp"&gt;Source&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-8615651998578496930?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/8615651998578496930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=8615651998578496930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/8615651998578496930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/8615651998578496930'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/balanced-tree-remove-elementnode.html' title='Balanced tree - Remove element/node'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-1811578285052639939</id><published>2007-11-26T15:45:00.000-08:00</published><updated>2007-11-26T15:51:08.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>Generate perfectly balanced tree</title><content type='html'>The script that follows generates perfectly balanced tree with "n" nodes:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;function tree( $num_nodes )&lt;br /&gt;{&lt;br /&gt; global $tree;&lt;br /&gt; &lt;br /&gt; if( $num_nodes == 0 )&lt;br /&gt;  return null;&lt;br /&gt; &lt;br /&gt; $left = (int)($num_nodes / 2);&lt;br /&gt; $right = $num_nodes - $left -1;&lt;br /&gt; &lt;br /&gt; $tree[]['value'] = (int)(rand( 1, 50) / $num_nodes+1);&lt;br /&gt; $last = count($tree)-1;&lt;br /&gt; &lt;br /&gt; $tree[$last]['left'] = tree( $left );&lt;br /&gt; $tree[$last]['right'] = tree( $right );&lt;br /&gt; &lt;br /&gt; return $last;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-1811578285052639939?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/1811578285052639939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=1811578285052639939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/1811578285052639939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/1811578285052639939'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/generation-perfectly-balanced-tree.html' title='Generate perfectly balanced tree'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-2433748830947569882</id><published>2007-11-14T00:32:00.000-08:00</published><updated>2007-11-14T00:58:19.779-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recursive algorithms'/><title type='text'>Eight queens</title><content type='html'>Here is recursive algorithm solving the problem with eight queens which don't threaten each other:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function check( $i )&lt;br /&gt;{&lt;br /&gt; global $column, $rows, $left_d, $right_d;&lt;br /&gt; for( $j = 1; $j &lt;= 8; $j++ )&lt;br /&gt; {&lt;br /&gt;  // check is the row and both diagonals are free&lt;br /&gt;  if( $rows[$j] &amp;&amp; $left_d[$i+$j] &amp;&amp; $right_d[$i-$j] )&lt;br /&gt;  {&lt;br /&gt;   $column[$i] = $j;//put the qeen on the $i column in the $j position&lt;br /&gt;   &lt;br /&gt;   //set row and diagonals to occupied &lt;br /&gt;   $rows[$j] = false;&lt;br /&gt;   $left_d[$i+$j] = false;&lt;br /&gt;   $right_d[$i-$j] = false;&lt;br /&gt;   &lt;br /&gt;   // if $i == last column(8) we print the results&lt;br /&gt;   if( $i &lt; 8 )&lt;br /&gt;    check( $i + 1 );&lt;br /&gt;   else&lt;br /&gt;    print_results();&lt;br /&gt;   &lt;br /&gt;   //unset row and diagonals&lt;br /&gt;   $rows[$j] = true;&lt;br /&gt;   $left_d[$i+$j] = true;&lt;br /&gt;   $right_d[$i-$j] = true;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function print_results()&lt;br /&gt;{&lt;br /&gt; global $column;&lt;br /&gt; foreach( $column as $value )&lt;br /&gt;  echo $value ."&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;";&lt;br /&gt; &lt;br /&gt; echo "&amp;lt;br /&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for( $i = 1; $i &lt;= 8; $i++ )&lt;br /&gt; $rows[$i] = true;&lt;br /&gt;&lt;br /&gt;for( $i = 2; $i &lt;= 16; $i++ )&lt;br /&gt; $left_d[$i] = true;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;for( $i = -7; $i &lt;= 7; $i++ )&lt;br /&gt; $right_d[$i] = true;&lt;br /&gt;&lt;br /&gt;check(1);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-2433748830947569882?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/2433748830947569882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=2433748830947569882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/2433748830947569882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/2433748830947569882'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/eight-queens.html' title='Eight queens'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-718759036259752924</id><published>2007-11-09T13:52:00.000-08:00</published><updated>2009-11-15T12:26:29.877-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Benchmark</title><content type='html'>Here is benchmark of all array sorting algorithms post in the blog. Sorting arrays of 10 000 elements:&lt;br /&gt;&lt;table style="border: 1px solid ; border-collapse: collapse; margin-top: -450px;" border="1"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;Name&lt;/th&gt;&lt;br /&gt;&lt;th&gt;random&lt;/th&gt;&lt;br /&gt;&lt;th&gt;sorted&lt;/th&gt;&lt;br /&gt;&lt;th&gt;rsorted&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;straightInsertion&lt;/td&gt;&lt;td&gt;7.48131&lt;/td&gt;&lt;td&gt;0.0095&lt;/td&gt;&lt;td&gt;13.68925&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;binaryInsertion&lt;/td&gt;&lt;td&gt;5.46446&lt;/td&gt;&lt;td&gt;0.05528&lt;/td&gt;&lt;td&gt;10.8473&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;straightSelection&lt;/td&gt;&lt;td&gt;21.2452&lt;/td&gt;&lt;td&gt;21.34226&lt;/td&gt;&lt;td&gt;25.2773&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;bubbleSort&lt;/td&gt;&lt;td&gt;22.76245&lt;/td&gt;&lt;td&gt;12.45991&lt;/td&gt;&lt;td&gt;31.98982&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;shakerSort&lt;/td&gt;&lt;td&gt;18.75352&lt;/td&gt;&lt;td&gt;0.00392&lt;/td&gt;&lt;td&gt;32.69624&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;heapSort&lt;/td&gt;&lt;td&gt;0.11843&lt;/td&gt;&lt;td&gt;0.12559&lt;/td&gt;&lt;td&gt;0.11432&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;quickSortRecursive&lt;/td&gt;&lt;td&gt;11.91182&lt;/td&gt;&lt;td&gt;6.7423&lt;/td&gt;&lt;td&gt;6.43074&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;quickSortRecursiveNew&lt;/td&gt;&lt;td&gt;7.41534&lt;/td&gt;&lt;td&gt;7.45058&lt;/td&gt;&lt;td&gt;7.38413&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;quickSort&lt;/td&gt;&lt;td&gt;0.05555&lt;/td&gt;&lt;td&gt;0.02845&lt;/td&gt;&lt;td&gt;0.03096&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;sort&lt;/td&gt;&lt;td&gt;0.00869&lt;/td&gt;&lt;td&gt;0.00467&lt;/td&gt;&lt;td&gt;0.005&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: -270px;"&gt;&lt;br /&gt;Different sort algorithms have advantage in certain conditions. So this benchmark can't show the advantage of all of them.&lt;br /&gt;&lt;br /&gt;Function quickSortRecursive receives an array as parameter and then creates new static array for the recursion calls. quickSortRecursiveNew uses global array and it sorts random array faster then quickSortRecursive.&lt;br /&gt;The iterative version of quick sort is more then 100 faster then recursive one!!!&lt;br /&gt;&lt;br /&gt;The last function is PHP native function for sorting arrays. It so fast because it isn't run through PHP interpreter. Use PHP native functions, they are a lot faster.&lt;br /&gt;&lt;br /&gt;The source of benchmark and all of the functions can be found &lt;a href="http://iskren.biz/src/arrays_sorting.sphp"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-718759036259752924?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/718759036259752924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=718759036259752924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/718759036259752924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/718759036259752924'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/benchmark.html' title='Benchmark'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-5456900393950354525</id><published>2007-11-09T13:32:00.000-08:00</published><updated>2007-11-12T11:44:06.271-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Quicksort</title><content type='html'>Quicksort is a well-known sorting algorithm developed by C. A. R. Hoare that, on average, makes Θ(nlogn) (big O notation) comparisons to sort n items. However, in the worst case, it makes Θ(n2) comparisons. Typically, quicksort is significantly faster in practice than other Θ(nlogn) algorithms, because its inner loop can be efficiently implemented on most architectures, and in most real-world data it is possible to make design choices which minimize the possibility of requiring quadratic time.&lt;br /&gt;&lt;br /&gt;Quicksort is a comparison sort and, in efficient implementations, is not a stable sort.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;// Recursive version:&lt;br /&gt;function quickSortRecursive( $arr, $left = 0 , $right = NULL )&lt;br /&gt;{&lt;br /&gt; // when the call is recursive we need to change &lt;br /&gt; //the array passed to the function yearlier&lt;br /&gt; static $array = array(); &lt;br /&gt; if( $right == NULL )&lt;br /&gt;  $array = $arr;&lt;br /&gt;&lt;br /&gt; if( $right == NULL )&lt;br /&gt;  $right = count($array)-1;//last element of the array&lt;br /&gt; &lt;br /&gt; $i = $left;&lt;br /&gt; $j = $right;&lt;br /&gt; &lt;br /&gt; $tmp = $array[(int)( ($left+$right)/2 )];&lt;br /&gt;&lt;br /&gt; // partion the array in two parts. &lt;br /&gt; // left from $tmp are with smaller values,&lt;br /&gt; // right from $tmp are with bigger ones&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt;  while( $array[$i] &lt; $tmp )&lt;br /&gt;   $i++;&lt;br /&gt;  &lt;br /&gt;  while( $tmp &lt; $array[$j] ) &lt;br /&gt;   $j--;&lt;br /&gt;  &lt;br /&gt;  // swap elements from the two sides &lt;br /&gt;  if( $i &lt;= $j )&lt;br /&gt;  {&lt;br /&gt;   $w = $array[$i];&lt;br /&gt;   $array[$i] = $array[$j];&lt;br /&gt;   $array[$j] = $w;&lt;br /&gt;   &lt;br /&gt;   $i++;&lt;br /&gt;   $j--;&lt;br /&gt;  }&lt;br /&gt; }while( $i &lt;= $j );&lt;br /&gt; &lt;br /&gt; // devide left side if it is longer the 1 element&lt;br /&gt; if( $left &lt; $j )&lt;br /&gt;  quickSortRecursive(NULL, $left, $j);&lt;br /&gt; &lt;br /&gt; // the same with the right side&lt;br /&gt; if( $i &lt; $right )&lt;br /&gt;  quickSortRecursive(NULL, $i, $right);&lt;br /&gt;&lt;br /&gt; // when all partitions have one element&lt;br /&gt; // the array is sorted&lt;br /&gt; &lt;br /&gt; return $array;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;// Non recursive version:&lt;br /&gt;function quickSort( $array )&lt;br /&gt;{&lt;br /&gt; $cur = 1;&lt;br /&gt; $stack[1]['l'] = 0;&lt;br /&gt; $stack[1]['r'] = count($array)-1;&lt;br /&gt; &lt;br /&gt; do &lt;br /&gt; {&lt;br /&gt;  $l = $stack[$cur]['l'];&lt;br /&gt;  $r = $stack[$cur]['r'];&lt;br /&gt;  $cur--;&lt;br /&gt;  &lt;br /&gt;  do&lt;br /&gt;  {&lt;br /&gt;   $i = $l;&lt;br /&gt;   $j = $r;&lt;br /&gt;   $tmp = $array[(int)( ($l+$r)/2 )];&lt;br /&gt;&lt;br /&gt;   // partion the array in two parts.&lt;br /&gt;   // left from $tmp are with smaller values,&lt;br /&gt;   // right from $tmp are with bigger ones&lt;br /&gt;   do&lt;br /&gt;   {&lt;br /&gt;    while( $array[$i] &lt; $tmp )&lt;br /&gt;     $i++;&lt;br /&gt;    &lt;br /&gt;    while( $tmp &lt; $array[$j] ) &lt;br /&gt;     $j--;&lt;br /&gt;    &lt;br /&gt;    // swap elements from the two sides &lt;br /&gt;    if( $i &lt;= $j )&lt;br /&gt;    {&lt;br /&gt;     $w = $array[$i];&lt;br /&gt;     $array[$i] = $array[$j];&lt;br /&gt;     $array[$j] = $w;&lt;br /&gt;     &lt;br /&gt;     $i++;&lt;br /&gt;     $j--;&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;   }while( $i &lt;= $j );&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;   if( $i &lt; $r )&lt;br /&gt;   {&lt;br /&gt;    $cur++;&lt;br /&gt;    $stack[$cur]['l'] = $i;&lt;br /&gt;    $stack[$cur]['r'] = $r;&lt;br /&gt;   }&lt;br /&gt;   $r = $j;&lt;br /&gt;  &lt;br /&gt;  }while( $l &lt; $r );&lt;br /&gt;  &lt;br /&gt; }while( $cur != 0 );&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-5456900393950354525?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/5456900393950354525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=5456900393950354525' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/5456900393950354525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/5456900393950354525'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/quicksort.html' title='Quicksort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-7310929615130271235</id><published>2007-11-09T13:27:00.000-08:00</published><updated>2007-11-12T11:44:06.271-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Heapsort</title><content type='html'>Heapsort is a comparison-based sorting algorithm, and is part of the selection sort family. Although somewhat slower in practice on most machines than a good implementation of quicksort, it has the advantage of a worst-case O(n log n) runtime. Heapsort is an in-place algorithm, but is not a stable sort.&lt;br /&gt;&lt;br /&gt;During extraction, the only space required is that needed to store the heap. In order to achieve constant space overhead, the heap is stored in the part of the input array that has not yet been sorted. (The structure of this heap is described at Binary heap: Heap implementation.)&lt;br /&gt;&lt;br /&gt;Heapsort uses two heap operations: insertion and root deletion. Each extraction places an element in the last empty location of the array. The remaining prefix of the array stores the unsorted elements.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function heapSort( $array )&lt;br /&gt;{&lt;br /&gt; $right = count( $array )-1;&lt;br /&gt; $left = (int)($right/2) + 1;&lt;br /&gt; &lt;br /&gt; while( $left &gt; 0 )&lt;br /&gt; {&lt;br /&gt;  $left--;&lt;br /&gt;  sift($array, $left, $right);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; while( $right &gt; 0 )&lt;br /&gt; {&lt;br /&gt;  $tmp = $array[0];&lt;br /&gt;  $array[0] = $array[$right];&lt;br /&gt;  $array[$right] = $tmp;&lt;br /&gt;  $right--;&lt;br /&gt;  &lt;br /&gt;  sift($array, $left, $right);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return $array;&lt;br /&gt;}&lt;br /&gt;function sift( &amp;$array, $left, $right )&lt;br /&gt;{&lt;br /&gt; $i = $left;&lt;br /&gt; $j = 2*$i;&lt;br /&gt; $tmp = $array[$i];&lt;br /&gt; &lt;br /&gt; while( $j &lt;= $right )&lt;br /&gt; {&lt;br /&gt;  if( $j &lt; $right &amp;&amp; $array[$j] &lt; $array[$j+1] )&lt;br /&gt;   $j++;&lt;br /&gt;  if( $tmp &gt;= $array[$j] ){&lt;br /&gt;   $array[$i] = $tmp;&lt;br /&gt;   return 0;&lt;br /&gt;  }&lt;br /&gt;  $array[$i] = $array[$j];&lt;br /&gt;  $i = $j;&lt;br /&gt;  $j = 2*$i;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; $array[$i] = $tmp;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-7310929615130271235?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/7310929615130271235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=7310929615130271235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/7310929615130271235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/7310929615130271235'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/heapsort.html' title='Heapsort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-439687841279232473</id><published>2007-11-09T13:24:00.001-08:00</published><updated>2007-11-12T11:44:06.272-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Shaker Sort</title><content type='html'>Shaker sort is a simple optimization that does passes in both directions, allowing out of place items to move fast across the whole array. Same complexity as Bubble sort, only works much better when some smal items are at the end of the array.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function shakerSort( $array )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; $l = 1;&lt;br /&gt; $r = count($array)-1;&lt;br /&gt; $k = $r;&lt;br /&gt; &lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt;  //move smaller values to the left&lt;br /&gt;  for( $j=$r; $j &gt;= $l; $j-- )&lt;br /&gt;   if( $array[$j-1] &gt; $array[$j] )&lt;br /&gt;   {&lt;br /&gt;    $tmp = $array[$j-1];&lt;br /&gt;    $array[$j-1] = $array[$j];&lt;br /&gt;    $array[$j] = $tmp;&lt;br /&gt;    $k = $j;&lt;br /&gt;   }&lt;br /&gt;  $l = $k+1;&lt;br /&gt;  // move bigger values to the right&lt;br /&gt;  for( $j=$l; $j &lt;= $r; $j++ ){&lt;br /&gt;   if( $array[$j-1] &gt; $array[$j])&lt;br /&gt;   {&lt;br /&gt;    $tmp = $array[$j-1];&lt;br /&gt;    $array[$j-1] = $array[$j];&lt;br /&gt;    $array[$j] = $tmp;&lt;br /&gt;    $k = $j;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  $r = $k-1;&lt;br /&gt; }while( $l &lt;= $r );&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-439687841279232473?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/439687841279232473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=439687841279232473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/439687841279232473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/439687841279232473'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/shaker-sort.html' title='Shaker Sort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-4506304287213841633</id><published>2007-11-09T13:16:00.000-08:00</published><updated>2007-11-12T11:44:06.273-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Bubble sort</title><content type='html'>Bubble sort is a simple sorting algorithm. It works by repeatedly stepping through the list to be sorted, comparing two items at a time and swapping them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which means the list is sorted.&lt;br /&gt;&lt;br /&gt;example: 5 1 4 2 8 - unsorted array 1 4 2 5 8 - after one pass 1 2 4 5 8 - sorted array&lt;br /&gt;&lt;br /&gt;The algorithm gets its name from the way smaller elements "bubble" to the top (i.e. the beginning) of the list via the swaps. (Another opinion: it gets its name from the way greater elements "bubble" to the end.) Because it only uses comparisons to operate on elements, it is a comparison sort. This is the easiest comparison sort to implement.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function bubbleSort( $array )&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; for( $i=1; $i &lt; count($array); $i++ )&lt;br /&gt;  // move smaller from two elements up until reach current position&lt;br /&gt;  for( $j = (count($array)-1); $j &gt;= $i; $j-- )&lt;br /&gt;   if( $array[$j-1] &gt; $array[$j] )&lt;br /&gt;   {&lt;br /&gt;    $tmp = $array[$j-1];&lt;br /&gt;    $array[$j-1] = $array[$j];&lt;br /&gt;    $array[$j] = $tmp;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-4506304287213841633?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/4506304287213841633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=4506304287213841633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4506304287213841633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4506304287213841633'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/bubble-sort_11.html' title='Bubble sort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-4023856402916547413</id><published>2007-11-09T13:08:00.000-08:00</published><updated>2007-11-12T11:44:06.273-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Selection sort</title><content type='html'>Selection sort is a sorting algorithm, specifically an in-place comparison sort. It has Θ(n2) complexity, making it inefficient on large lists, and generally performs worse than the similar insertion sort. Selection sort is noted for its simplicity, and also has performance advantages over more complicated algorithms in certain situations. It works as follows:&lt;br /&gt;&lt;br /&gt;1. Find the minimum value in the list&lt;br /&gt;2. Swap it with the value in the first position&lt;br /&gt;3. Repeat the steps above for remainder of the list (starting at the second position)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Effectively, we divide the list into two parts: the sublist of items already sorted, which we build up from left to right and is found at the beginning, and the sublist of items remaining to be sorted, occupying the remainder of the array.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function straightSelection( $array )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; for( $i=0; $i &lt; count($array); $i ++ )&lt;br /&gt; {&lt;br /&gt;  $k = $i;&lt;br /&gt;  $tmp = $array[$i];&lt;br /&gt;  &lt;br /&gt;  // search elements right to current for the smallest&lt;br /&gt;  for( $j = $i+1; $j &lt; count($array); $j++ )&lt;br /&gt;   if( $array[$j] &lt; $tmp )&lt;br /&gt;   {&lt;br /&gt;    $k=$j;&lt;br /&gt;    $tmp = $array[$j];&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;  // switch places of current element and previously found&lt;br /&gt;  $array[$k] = $array[$i];&lt;br /&gt;  $array[$i] = $tmp;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-4023856402916547413?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/4023856402916547413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=4023856402916547413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4023856402916547413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/4023856402916547413'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/selection-sort.html' title='Selection sort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-7494719054240017752</id><published>2007-11-09T13:00:00.000-08:00</published><updated>2007-11-12T11:44:06.274-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Binary Insertion sort</title><content type='html'>The straight insertion algorithm presented in the preceding section does a linear search to find the position in which to do the insertion. However, since the element is inserted into a sequence that is already sorted, we can use a binary search instead of a linear search. Whereas a linear search requires Θ(n) comparisons in the worst case, a binary search only requires Θ(logn) comparisons. Therefore, if the cost of a comparison is significant, the binary search may be preferred.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;br /&gt;function binaryInsertion( $array )&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; for( $i=1; $i &lt; count($array); $i++ )&lt;br /&gt; {&lt;br /&gt;  $tmp = $array[$i];&lt;br /&gt;  $left = 0;&lt;br /&gt;  $right = $i-1;&lt;br /&gt;  &lt;br /&gt;  // finds the last element with value smaller then current element&lt;br /&gt;  // all elements before the current are sorted&lt;br /&gt;  // so we can find the middle and&lt;br /&gt;  // check only the right(correct) half&lt;br /&gt;  while( $left &lt;= $right )&lt;br /&gt;  {&lt;br /&gt;   $middle = (int)(($left+$right)/2);&lt;br /&gt;   if( $tmp &lt; $array[$middle] )&lt;br /&gt;    $right = $middle - 1;&lt;br /&gt;   else&lt;br /&gt;    $left = $middle + 1;&lt;br /&gt;  }&lt;br /&gt;  // loop until current element is smaller than previous.&lt;br /&gt;  // if so replace current with previous.&lt;br /&gt;  for( $j = $i-1; $j &gt;= $left; $j-- )&lt;br /&gt;   $array[$j+1] = $array[$j];&lt;br /&gt;  &lt;br /&gt;  $array[$left] = $tmp;&lt;br /&gt;  // now we can write current element's value on its position.&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-7494719054240017752?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/7494719054240017752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=7494719054240017752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/7494719054240017752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/7494719054240017752'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/binary-insertion-sort-straight.html' title='Binary Insertion sort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4604156374423970436.post-2569480182528782255</id><published>2007-11-09T12:55:00.000-08:00</published><updated>2007-11-14T00:52:11.169-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sorting algorithms'/><title type='text'>Straight Insertion sort</title><content type='html'>The key step of any insertion sorting algorithm involves the insertion of an item into a sorted sequence. There are two aspects to an insertion--finding the correct position in the sequence at which to insert the new element and moving all the elements over to make room for the new one.&lt;br /&gt;&lt;br /&gt;This section presents the straight insertion sorting algorithm. Straight insertion sorting uses a linear search to locate the position at which the next element is to be inserted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP implementation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;function straightInsertion( $array )&lt;br /&gt;{&lt;br /&gt; &lt;br /&gt; for( $i=1; $i &lt; count($array); $i++ )&lt;br /&gt; {&lt;br /&gt;  $tmp = $array[$i];&lt;br /&gt;  // store current element's value because it&lt;br /&gt;  // will be overwritten if it is not in its place&lt;br /&gt;  &lt;br /&gt;  // loop until current element is smaller than previous.&lt;br /&gt;  // if so replace current with previous.&lt;br /&gt;  for( $j = $i-1; $tmp &lt; $array[$j]; $j-- )&lt;br /&gt;   $array[$j+1] = $array[$j];&lt;br /&gt;&lt;br /&gt;  // now we can write current element's value on its position.&lt;br /&gt;  $array[$j+1] = $tmp;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return $array;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4604156374423970436-2569480182528782255?l=istoyanov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://istoyanov.blogspot.com/feeds/2569480182528782255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4604156374423970436&amp;postID=2569480182528782255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/2569480182528782255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4604156374423970436/posts/default/2569480182528782255'/><link rel='alternate' type='text/html' href='http://istoyanov.blogspot.com/2007/11/straight-insertion-sort-key-step-of-any.html' title='Straight Insertion sort'/><author><name>Iskren Stoyanov</name><uri>http://www.blogger.com/profile/04582784957921457171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
