﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-那谁的技术博客-随笔分类-算法与数据结构</title><link>http://www.cppblog.com/converse/category/974.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 14 Nov 2008 09:27:11 GMT</lastBuildDate><pubDate>Fri, 14 Nov 2008 09:27:11 GMT</pubDate><ttl>60</ttl><item><title>ccache发布0.5版本</title><link>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 14 Nov 2008 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66929.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66929.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/11/14/66929.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/66929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-14 16:54 <a href="http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树的实现源码(第二次修订版)</title><link>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 10 Nov 2008 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66530.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66530.html</trackback:ping><description><![CDATA[我曾经写过两个两个红黑树的实现, 分别在:<br>http://www.cppblog.com/converse/archive/2006/10/07/13413.html<br>http://www.cppblog.com/converse/archive/2007/11/28/37430.html<br><br>最近因为要给<a href="http://code.google.com/p/commoncache/">ccache</a>加入红黑树的支持, 找出来曾经实现的代码作为参考, 这才发现原来的实现都是有问题的,也怪我的测试用例写的不好, 仅仅对插入操作进行了测试, 我向所有因为阅读了这份代码而造成困惑的朋友表示道歉.<br><br>这次重新实现, 所有的代码推倒重新编写, 参考了<a href="http://lxr.linux.no/linux/lib/rbtree.c">linux内核中红黑树的实现算法</a>, 并且对测试用例进行了加强,希望这是最后一个对红黑树算法的修订版本.<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*-----------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; RB-Tree的插入和删除操作的实现算法<br>&nbsp;&nbsp;&nbsp; 参考资料:<br>&nbsp;&nbsp;&nbsp; 1) &lt;&lt;Introduction to algorithm&gt;&gt;<br>&nbsp;&nbsp;&nbsp; 2) http://lxr.linux.no/linux/lib/rbtree.c<br><br>&nbsp;&nbsp;&nbsp; 作者：http://www.cppblog.com/converse/<br>&nbsp;&nbsp;&nbsp; 您可以自由的传播，修改这份代码，转载处请注明原作者<br><br>&nbsp;&nbsp;&nbsp; 红黑树的几个性质:<br>&nbsp;&nbsp;&nbsp; 1) 每个结点只有红和黑两种颜色<br>&nbsp;&nbsp;&nbsp; 2) 根结点是黑色的<br>&nbsp;&nbsp;&nbsp; 3)空节点是黑色的（红黑树中，根节点的parent以及所有叶节点lchild、rchild都不指向NULL，而是指向一个定义好的空节点）。 <br>&nbsp;&nbsp;&nbsp; 4) 如果一个结点是红色的,那么它的左右两个子结点的颜色是黑色的<br>&nbsp;&nbsp;&nbsp; 5) 对于每个结点而言,从这个结点到叶子结点的任何路径上的黑色结点<br>&nbsp;&nbsp;&nbsp; 的数目相同<br>-------------------------------------------------------------*/<br>&nbsp;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br><br>typedef int key_t;<br>typedef int data_t;<br><br>typedef enum color_t<br>{<br>&nbsp;&nbsp;&nbsp; RED = 0,<br>&nbsp;&nbsp;&nbsp; BLACK = 1<br>}color_t;<br><br>typedef struct rb_node_t<br>{<br>&nbsp;&nbsp;&nbsp; struct rb_node_t *left, *right, *parent;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; data_t data;<br>&nbsp;&nbsp;&nbsp; color_t color;<br>}rb_node_t;<br><br>/* forward declaration */<br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root);<br>rb_node_t* rb_search(key_t key, rb_node_t* root);<br>rb_node_t* rb_erase(key_t key, rb_node_t* root);<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i, count = 900000;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; rb_node_t* root = NULL, *node = NULL;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>&nbsp;&nbsp;&nbsp; for (i = 1; i &lt; count; ++i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = rand() % count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_insert(key, i, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((node = rb_search(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(i % 10))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_erase(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d success\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d error\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>static rb_node_t* rb_new_node(key_t key, data_t data)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = (rb_node_t*)malloc(sizeof(struct rb_node_t));<br><br>&nbsp;&nbsp;&nbsp; if (!node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("malloc error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;key = key, node-&gt;data = data;<br><br>&nbsp;&nbsp;&nbsp; return node;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp; a&nbsp; right&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp; y<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp; y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; b<br>&nbsp;-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* right = node-&gt;right;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;right = right-&gt;left))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; right-&gt;left = node;<br><br>&nbsp;&nbsp;&nbsp; if ((right-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = right;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = right;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp; left&nbsp; y&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; node<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp; a&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp; y<br>-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_right(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* left = node-&gt;left;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;left = left-&gt;right))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; left-&gt;right = node;<br><br>&nbsp;&nbsp;&nbsp; if ((left-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = left;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = left;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_insert_rebalance(rb_node_t *node, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent, *gparent, *uncle, *tmp;<br><br>&nbsp;&nbsp;&nbsp; while ((parent = node-&gt;parent) &amp;&amp; parent-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent = parent-&gt;parent;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent == gparent-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;right == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; root-&gt;color = BLACK;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_erase_rebalance(rb_node_t *node, rb_node_t *parent, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *other, *o_left, *o_right;<br><br>&nbsp;&nbsp;&nbsp; while ((!node || node-&gt;color == BLACK) &amp;&amp; node != root)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;right || other-&gt;right-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_left = other-&gt;left))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;left || other-&gt;left-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_right = other-&gt;right))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_search_auxiliary(key_t key, rb_node_t* root, rb_node_t** save)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = root, *parent = NULL;<br>&nbsp;&nbsp;&nbsp; int ret;<br><br>&nbsp;&nbsp;&nbsp; while (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = node-&gt;key - key;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (0 &lt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (0 &gt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (save)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *save = parent;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return NULL;<br>}<br><br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent = NULL, *node;<br><br>&nbsp;&nbsp;&nbsp; parent = NULL;<br>&nbsp;&nbsp;&nbsp; if ((node = rb_search_auxiliary(key, root, &amp;parent)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; node = rb_new_node(key, data);<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = parent; <br>&nbsp;&nbsp;&nbsp; node-&gt;left = node-&gt;right = NULL;<br>&nbsp;&nbsp;&nbsp; node-&gt;color = RED;<br><br>&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;key &gt; key)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return rb_insert_rebalance(node, root);<br>}<br><br>rb_node_t* rb_search(key_t key, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; return rb_search_auxiliary(key, root, NULL);<br>}<br><br>rb_node_t* rb_erase(key_t key, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *child, *parent, *old, *left, *node;<br>&nbsp;&nbsp;&nbsp; color_t color;<br><br>&nbsp;&nbsp;&nbsp; if (!(node = rb_search_auxiliary(key, root, NULL)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("key %d is not exist!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; old = node;<br><br>&nbsp;&nbsp;&nbsp; if (node-&gt;left &amp;&amp; node-&gt;right)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((left = node-&gt;left) != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node-&gt;parent == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent = old-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = old-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;right = old-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;left = old-&gt;left;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent-&gt;left == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!node-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (!node-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; free(old);<br><br>&nbsp;&nbsp;&nbsp; if (color == BLACK)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_erase_rebalance(child, parent, root);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br></span><span style="color: #000000;"><br><br></span></div>
<br><br>     <img src ="http://www.cppblog.com/converse/aggbug/66530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-10 17:50 <a href="http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.4版本</title><link>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 31 Oct 2008 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/65656.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/65656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/65656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/10/31/65656.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/65656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-10-31 23:59 <a href="http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-4)递归版插入排序</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63068.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63068.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63068.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 23:27 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解problem2.4)寻找一个序列中逆序对的数量</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63058.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63058.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63058.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63058.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 20:32 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-7)给定一个整数序列以及一个数X,确定该序列中是否有两个数的和为X</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63024.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63024.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 10:40 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原地归并算法</title><link>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 28 Sep 2008 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63008.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63008.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/28/63008.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-28 19:51 <a href="http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树删除节点算法</title><link>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 17 Sep 2008 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/62069.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/62069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/62069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/17/62069.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/62069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-17 12:38 <a href="http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树中单,双旋转的解释</title><link>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 07 Sep 2008 16:23:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/61266.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/61266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/61266.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/08/61266.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/61266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-08 00:23 <a href="http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前缀匹配问题与trie树</title><link>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 19 Aug 2008 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/59393.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/59393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/59393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/19/59393.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/59393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-19 23:41 <a href="http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器公共库开发-内存池管理模块</title><link>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 11 Aug 2008 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58563.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/11/58563.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-11 23:30 <a href="http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.3版本</title><link>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Thu, 07 Aug 2008 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58253.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58253.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/07/58253.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-07 17:27 <a href="http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用位操作得到大于N且为2的次方的最小的数</title><link>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 21 Jun 2008 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/54225.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/54225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/54225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何使用位操作得到大于N且为2的次方的最小的数&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/06/21/54225.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/54225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-06-21 15:36 <a href="http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.2版本</title><link>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 02 Apr 2008 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/46016.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/46016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/46016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ccache发布0.2版本&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/02/46016.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/46016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-02 12:00 <a href="http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>研究了一下SGI STL的内存算法</title><link>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 01 Apr 2008 11:55:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/45947.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/45947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/45947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿SGI STL的内存池算法.<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/01/45947.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/45947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-01 19:55 <a href="http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcache内存池的设计原理</title><link>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 21 Jan 2008 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/41592.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/41592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/41592.html</trackback:ping><description><![CDATA[memcache中管理内存的数据结构如下:<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">typedef&nbsp;struct&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;sizes&nbsp;of&nbsp;items&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;perslab;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;items&nbsp;per&nbsp;slab&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slots;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;list&nbsp;of&nbsp;item&nbsp;ptrs&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_total;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;previous&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_curr;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;first&nbsp;free&nbsp;slot&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">end_page_ptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;pointer&nbsp;</span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">next</span><span style="COLOR: #000000">&nbsp;free&nbsp;item&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;page,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;end_page_free;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;number&nbsp;of&nbsp;items&nbsp;remaining&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;last&nbsp;alloced&nbsp;page&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;slabs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;slabs&nbsp;were&nbsp;allocated&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;this&nbsp;class&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slab_list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;of&nbsp;slab&nbsp;pointers&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;list_size;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;prev&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;killing;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;index</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;of&nbsp;dying&nbsp;slab,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;zero&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;none&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;slabclass_t;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>程序中有一个全局的数组<br>static slabclass_t slabclass[POWER_LARGEST + 1]用于保存slab,预分配内存池时调用的是void slabs_init(const size_t limit, const double factor) 函数,其中limit是内存池的最大容量,factor是分配时的增长因子.<br>比方说,加入factor是2,第一个在slabclass数组中的slab的每个item大小是128字节,那么下一个slab每个item的大小就是128*2,再下一个就是128*2*2(注意,为了简化问题的说明,上面没有考虑地址对齐的因素).<br><br>在预分配内存池时,最多给每个slab保存item的容量是1M内存,这个数值由#define POWER_BLOCK 1048576决定.<br>因此,slab中的几个元素在预分配内存时是这么定的:<br>size有一个起始值,这个值以后的增长由factor决定,增长的过程前面已经阐述过了;<br>perslab保存的是一个slab存放的item数量,因此perslab = POWER_BLOCK / slabclass[i].size;<br>如果预先分配一段内存供使用的话,也就是没有定义DONT_PREALLOC_SLABS宏,那么就调用slabs_preallocate进行预分配内存.<br>其中,end_page_ptr指向这个预分配好的指针,end_page_free表示的是目前空闲可用item的数量,在预分配时,这个值与perslab相同.<br>在这个内存池模型中,每个page实际上是一个数组,数组中每个元素的大小就是这个slab中item的大小.<br><br>另外,slots保存的是释放出来的item指针,sl_total表示总的数量,sl_curr表示的是目前可用的已经释放出来的item数量.<br><br>每一次要分配内存的时候,首先根据需要分配的内存大小在slabclass数组中查找索引最小的一个大于所要求内存的slab,如果slots不为空,那么就从这里返回内存,否则去查找end_page_ptr,如果也没有,那么就只能返回NULL了.<br>每一次释放内存的时候,同样的找到应该返回内存的slab元素,改写前面提到的slot指针和sl_curr数.<br><br>有点仓促,以后再完善~~<br><br><br>
<img src ="http://www.cppblog.com/converse/aggbug/41592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-01-21 23:34 <a href="http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]红黑树的实现代码(修订版)</title><link>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 28 Nov 2007 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37430.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [算法]红黑树的实现代码(修订版)&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/28/37430.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-28 14:29 <a href="http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]找出m个数中最小的n个数</title><link>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 26 Nov 2007 10:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37333.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37333.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 找出n个数中最大的m个数。&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/26/37333.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-26 18:54 <a href="http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树的实现代码</title><link>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 29 Aug 2007 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/31179.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/31179.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/31179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AVL树的实现代码&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/08/29/31179.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/31179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-08-29 22:06 <a href="http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仿STL中的堆算法的一个实现</title><link>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 19 Mar 2007 16:28:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/20175.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/20175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/20175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿STL中的堆算法的一个实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/03/20/20175.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/20175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-03-20 00:28 <a href="http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[数据结构]红黑树的实现源码</title><link>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 07 Oct 2006 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13413.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13413.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 半年之前写的一个红黑树的实现算法了,当时有点忙没有写相应的文档,一下子几乎全都忘记了,作一个记录,改天有空了来补充说明文档.&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/10/07/13413.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-10-07 14:32 <a href="http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]合并两个已经排序的数组为另一个数组</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13006.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13006.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13006.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设子数组a[0:k]和a[k+1:n-1]已排好序（0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法．要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13006.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:27 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]交换两个子数组的元素值</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13005.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13005.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设a[0:n-1]是一个有n个元素的数组，k(0<=k<=n-1)是一个非负整数．试设计一个算法将子数组a[0:k]与a[k+1:n-1]换位．要求算法在最坏情况下耗时O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13005.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:21 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉查找树的解析与实现</title><link>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 28 Jul 2006 16:33:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/10665.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/10665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/10665.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 二叉查找树的解析与实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/29/10665.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/10665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-29 00:33 <a href="http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]判断一个数是不是2的幂?</title><link>http://www.cppblog.com/converse/archive/2006/07/10/9664.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 10 Jul 2006 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/10/9664.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9664.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/10/9664.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9664.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [算法问题]判断一个数是不是2的幂?&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/10/9664.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-10 23:25 <a href="http://www.cppblog.com/converse/archive/2006/07/10/9664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归和递推的非严格概念解释</title><link>http://www.cppblog.com/converse/archive/2006/07/09/9615.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 09 Jul 2006 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/09/9615.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9615.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/09/9615.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9615.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 时常看到这两个词,有时分不清区别,想了一想,写了这篇非严格的概念分析&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/09/9615.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-09 21:43 <a href="http://www.cppblog.com/converse/archive/2006/07/09/9615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树遍历算法集合(前中后序遍历的递归和非递归算法,层序遍历算法)</title><link>http://www.cppblog.com/converse/archive/2006/07/08/9577.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 08 Jul 2006 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/08/9577.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9577.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/08/9577.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9577.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 费了两天时间写的,包括前中后序遍历的递归和非递归算法,还有层序遍历总共2*3 + 1 = 7中遍历二叉树的算法,感觉其中后序遍历的非递归算法比较困难,想了很久最后的实现还是不够优雅,请大家指正~~总共三个文件,一个头文件,一个对应的cpp文件,还有一个用于测试的文件.头文件:/**//*********************************************************...&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/08/9577.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-08 15:21 <a href="http://www.cppblog.com/converse/archive/2006/07/08/9577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]寻找一个序列中第n大的元素</title><link>http://www.cppblog.com/converse/archive/2006/07/08/9564.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 07 Jul 2006 18:04:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/08/9564.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9564.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/08/9564.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9564.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9564.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题描述:给定一个序列,以及指定这个序列的一个范围,寻找这个范围之内第n大的元素,如果n大于这个范围之内的元素数量那么就返回-1.这是快速排序算法中partiton算法的一个应用,不断的分割序列,如果分割的位置正好是要找的位置,那么返回结果,否则视情况在前半部分和后半部分继续查找,当然这个时候n值也要相应的变化了~~														/**/										/...&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/08/9564.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-08 02:04 <a href="http://www.cppblog.com/converse/archive/2006/07/08/9564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KMP算法的实现</title><link>http://www.cppblog.com/converse/archive/2006/07/05/9447.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 05 Jul 2006 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/05/9447.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9447.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/05/9447.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9447.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9447.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: KMP算法是一种用于字符串匹配的算法,这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始,而不必从头开始匹配字符串.因此这个算法的关键在于,当某个位置的匹配不成功的时候,应该从模式字符串的哪一个位置开始新的比较.假设这个值存放在一个next数组中,其中next数组中的元素满足这个条件:next[j] = k,表示的是当模式字符串中的第j + 1个(...&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/05/9447.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-05 17:44 <a href="http://www.cppblog.com/converse/archive/2006/07/05/9447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见排序算法的实现(六)-归并排序</title><link>http://www.cppblog.com/converse/archive/2006/07/04/9354.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 03 Jul 2006 17:34:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/04/9354.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9354.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/04/9354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9354.html</trackback:ping><description><![CDATA[归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序,完毕之后再按照顺序进行合并.<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 归并排序中的合并算法</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Merge(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> array[], </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> start, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mid, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> end)<br /><img id="Codehighlighter1_67_554_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_554_Open_Text.style.display='none'; Codehighlighter1_67_554_Closed_Image.style.display='inline'; Codehighlighter1_67_554_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_554_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_554_Closed_Text.style.display='none'; Codehighlighter1_67_554_Open_Image.style.display='inline'; Codehighlighter1_67_554_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_554_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_67_554_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> temp1[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">], temp2[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n1, n2;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    n1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> mid </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> start </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    n2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> end </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> mid;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 拷贝前半部分数组</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> n1; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_194_228_Open_Image" onclick="this.style.display='none'; Codehighlighter1_194_228_Open_Text.style.display='none'; Codehighlighter1_194_228_Closed_Image.style.display='inline'; Codehighlighter1_194_228_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_194_228_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_194_228_Closed_Text.style.display='none'; Codehighlighter1_194_228_Open_Image.style.display='inline'; Codehighlighter1_194_228_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_194_228_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_194_228_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        temp1[i] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> array[start </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> i];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 拷贝后半部分数组</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> n2; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_274_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_310_Open_Text.style.display='none'; Codehighlighter1_274_310_Closed_Image.style.display='inline'; Codehighlighter1_274_310_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_274_310_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_274_310_Closed_Text.style.display='none'; Codehighlighter1_274_310_Open_Image.style.display='inline'; Codehighlighter1_274_310_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_274_310_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_274_310_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        temp2[i] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> array[mid </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 把后面的元素设置的很大</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    temp1[n1] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> temp2[n2] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 逐个扫描两部分数组然后放到相应的位置去</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> k </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> start, i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, j </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; k </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> end; k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_434_552_Open_Image" onclick="this.style.display='none'; Codehighlighter1_434_552_Open_Text.style.display='none'; Codehighlighter1_434_552_Closed_Image.style.display='inline'; Codehighlighter1_434_552_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_434_552_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_434_552_Closed_Text.style.display='none'; Codehighlighter1_434_552_Open_Image.style.display='inline'; Codehighlighter1_434_552_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_434_552_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_434_552_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (temp1[i] </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> temp2[j])<br /><img id="Codehighlighter1_466_502_Open_Image" onclick="this.style.display='none'; Codehighlighter1_466_502_Open_Text.style.display='none'; Codehighlighter1_466_502_Closed_Image.style.display='inline'; Codehighlighter1_466_502_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_466_502_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_466_502_Closed_Text.style.display='none'; Codehighlighter1_466_502_Open_Image.style.display='inline'; Codehighlighter1_466_502_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_466_502_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_466_502_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            array[k] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> temp1[i];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_513_549_Open_Image" onclick="this.style.display='none'; Codehighlighter1_513_549_Open_Text.style.display='none'; Codehighlighter1_513_549_Closed_Image.style.display='inline'; Codehighlighter1_513_549_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_513_549_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_513_549_Closed_Text.style.display='none'; Codehighlighter1_513_549_Open_Image.style.display='inline'; Codehighlighter1_513_549_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_513_549_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_513_549_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            array[k] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> temp2[j];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 归并排序</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> MergeSort(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> array[], </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> start, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> end)<br /><img id="Codehighlighter1_613_809_Open_Image" onclick="this.style.display='none'; Codehighlighter1_613_809_Open_Text.style.display='none'; Codehighlighter1_613_809_Closed_Image.style.display='inline'; Codehighlighter1_613_809_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_613_809_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_613_809_Closed_Text.style.display='none'; Codehighlighter1_613_809_Open_Image.style.display='inline'; Codehighlighter1_613_809_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_613_809_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_613_809_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (start </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> end)<br /><img id="Codehighlighter1_634_807_Open_Image" onclick="this.style.display='none'; Codehighlighter1_634_807_Open_Text.style.display='none'; Codehighlighter1_634_807_Closed_Image.style.display='inline'; Codehighlighter1_634_807_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_634_807_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_634_807_Closed_Text.style.display='none'; Codehighlighter1_634_807_Open_Image.style.display='inline'; Codehighlighter1_634_807_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_634_807_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_634_807_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (end </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> start) </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 对前半部分进行排序</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        MergeSort(array, start, i);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 对后半部分进行排序</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        MergeSort(array, i </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, end);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 合并前后两部分</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Merge(array, start, i, end);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.cppblog.com/converse/aggbug/9354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-04 01:34 <a href="http://www.cppblog.com/converse/archive/2006/07/04/9354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>