﻿<?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/Chipset/category/9264.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 25 Nov 2021 23:29:03 GMT</lastBuildDate><pubDate>Thu, 25 Nov 2021 23:29:03 GMT</pubDate><ttl>60</ttl><item><title>DIY一个小夜灯</title><link>http://www.cppblog.com/Chipset/archive/2021/11/06/217855.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Sat, 06 Nov 2021 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2021/11/06/217855.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/217855.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2021/11/06/217855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/217855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/217855.html</trackback:ping><description><![CDATA[<p><span style="font-family: Arial; font-size: 12pt;"></span></p><p style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; text-align: justify; background-color: #ffffff; line-height: normal;"><span style="font-family: Arial; font-size: 12pt;">本文是一个DIY小夜灯的简易文档，由于笔者水平有限，无法保证没有错误和疏漏，为了避免</span><span style="font-size: 12pt; font-family: Arial;">&#8220;</span><span style="font-family: Arial; font-size: 12pt;">碰瓷</span><span style="font-size: 12pt; font-family: Arial;">&#8221;</span><span style="font-family: Arial; font-size: 12pt;">，做出如下声明。<br /><br /></span></p><p style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; text-align: justify; background-color: #ffffff; line-height: normal;"><strong><span style="font-family: Arial; color: red; font-size: 12pt;">在实际操作中，依据此文而产生的任何问题</span><span style="color: red; font-size: 12pt; font-family: Arial;">(</span></strong><strong><span style="font-family: Arial; color: red; font-size: 12pt;">包括但不局限于财产损失，人身伤亡等</span><span style="color: red; font-size: 12pt; font-family: Arial;">)</span></strong><strong><span style="font-family: Arial; color: red; font-size: 12pt;">与笔者无关，笔者既不赔偿，也不负法律责任。<br /></span></strong></p><p style="color: #303030; font-family: Verdana, Helvetica, Arial; font-size: 12px; text-align: justify; background-color: #ffffff; line-height: normal;"><span style="font-family: Arial; color: red; font-size: 12pt;"><br />如果您已经阅读了本文的一部分或全部内容，则表明您同意了上面的这个声明。</span></p><p align="center" style="text-align: left; line-height: normal; background: white;"><span style="text-align: justify; font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;"><br />-------------------------下面正文--------------------------<br /><br /></span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">微小功率的</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">LED用的最多的就是阻容降压，然后限流点亮串联的LED。由于简单的阻容降压先天低效，只好串联LED提升工作电压来尽可能的提高效率，但由于LED的分散性，质量不好的先坏，串联起来的寿命远远低于单个LED的平均寿命。元器件简单降低成本，寿命还不会太长，两点都符合厂家经营之道，因此，这种先天缺陷的设计就成了市场主流。</span></p><p style="line-height: normal; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><span style="font-size:12.0pt; font-family:&quot;Microsoft YaHei&quot;,sans-serif;Times New Roman&quot;">下图是某个品牌</span><span style="font-size:12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Times New Roman&quot;">3W LED灯泡的电路，该电路负载部分是一个560欧电阻和5个LED串联，供电部分是阻容降压后桥式整流，电解电容滤波后得到大约18V的直流电， 220V侧通过大约57毫安的工作电流。算下来功率220 * 57 / 1000 = 12.54VA，灯泡标称3W，好到计量插座测得只有1W，功率因数只有可怜的0.08，这种垃圾货却符合某大国一级能耗标准[习惯就好，砖家们订立的脑残标准多了去了]。<br /></span><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUcAAACbCAYAAADxwlmLAAAdOklEQVR4Ae1dC5KjOgwk12Lvwx7ncZnlMJO7jF/JIJCN/APZcRJNFYXxp9Vu4475JDMY/VMFVAFVQBU4KTCccjRDFVAFVAFVwKg56kmgCqgCqgCjgJojI4pmqQKqgCqg5qjngCqgCqgCjAJfY47LNJhh2LZxNk9GDMyK1n3OZkQc2CewEBP3DvaGMy1YqntVQBXoRYGvMEdrSLuJPc08DmYIOJJb1xj3GNpO5vCyOBY3yIA3zjFr5lppniqgCrRW4AvMcTHTMBrHj+zqj5ocyr6aneObwbpbm2Uyw8BhIaa7V3N09dAjVaBXBT7fHFnzAsMcjGOC2wg959G5VLYrR64iW5/B9eKrOfY6FZSXKuAq8B3muF9SY+cZE8MiY4w1SLyvGDFGY1ac4zKZwWXMcb/3aWN4q1rCQ5OqgCrwOgW+1ByZy+dtDPyVor+S3IfKmp5//zDPHA8z3dE0oQrUV2CZzAM/9Lf9OP94cRczPR7Hw8vpn/klNZbpcWCMs/mhhaTeJyS/wxxP9wTBxJgVG3t/8Wx41kC59ttK0llsMitHNcdPmDpv2AcwRzC0IPXVGMEwOc+zxrgb4tPMfx5m8MwzCP2GBZ9vjtbwPCNkTdDAo2nm4YprjtYYT5fpOPJuXZvrYeo9R9RK960VgKugx7SwxgdcrPkFzQ6MczQzXSo+Z/PnMZmFc9LWnasQ7/PN0Q46fXVnvaTeV2/WKPHhzGpue9l+/3F7Gs0ZrTMo/qs92zFZuao5OoLpQUMF4ubImB/lBqvOx2T+OUa4rjQnN5O2euv0V5ijMWhS20vg9LrXMUcYy9Ugj4cm5DWdre5RdrxYvkM6dUYzz+5qVM3xrefLW5OHlaFz7tJVJJy3sAr8ByaI5zVZKeIluZrjW58DSl4VUAWSCsCqb72isn5nzRGOjwcwz/mPeQzbapE1x/W+4/Sh19VfsnJMnilaQRX4PgXA8OCWD7ijNUeyUrRqkMvm4GW13+ZzZFRz/Jyx1J6oAmUK4GrQtuLuORJztA9fPCPUBzJlemttVUAV6FGBp1kW+p3+9bKavudoH9jsr+rAYpJcVp+eZq+X1KHXfnpUoJSTrhxLFdP6qsCbKmDNj7wETo0Ru+S85I33G7EQHmzCu42IQe5P7lU+KKHm+EGDqV1RBVQBOQXUHANawqdj7C9VHmurZaqAKtC/AnEH6J9/NYYp80uVVyOmwKqAKtBEATXHgMwp80uVB2A1WxVQBd5EATXHwEClzC9VHoDVbFWgqQIP+gs7+CCl8v731/kaTdP+SgZTcwyomTK/VHkAVrNVgaYKgDm2NKvW8WqKqeYYUDdlfqnyAKxmv1gBGLdvGrvWZtU6Xs3TqVtzxJP4VSdyKm6qXHLQUAtJzG/EQh1bjl2uzsgtt35uvdZm1Tperg5X6nVpjnii0P2Vzt1pk5pAqfI7sWlbqkGrmDT+p6R9HXvS0ucmqXlrs2odT1IrH6uqOfqD/m7Hvlj0+N36kuJL+3Y3nYql5fiTYG32re851hrflv2AOVDdHK9MNE7cKzh32gCH2F+qPNa2pMzXoqRtbl3pvkjj5fYjVs/XsSeOPrdYP0rLWq/kasWrhRvTM+4AsZYZZXdOQHrCZIQSr5LiniqXJIRaSGJSLOm+SONRrnfSqGOP/JDbnf5xbVubSq14tXA5zTCvW3MEgq88iVOxU+UosNS+ZjxpbGk8KQ3xnOqVXw1erU2lVrxauLFzS80xoE7qRE2VB2AvZ9eMJ40tjXdZNKbht3FrbSq14tXCZU6RPUvNcZfCTaQmUarcRbt/VDOeNLY03n31DoRv4wamAn1uudV4cKLmeJzDNvXKEzkVO1XudeX2Yc140tjSeLfFIwDKjYjxRkk1R2+wXnkip2Knyr2u3D6sGU8aWxrvtngEQLkRMd4oqeboDdYrT+RU7FS515XbhzXjSWNL490WjwAoNyLGGyXVHL3B6vlE9qhWP6yphTS2NJ6kuMpNUs12WGqOntY9n8ge1eqHNbWQxpbGkxRXuUmq2Q5LzdHTuucT2aNa/bCmFtLY0niS4io3STXbYak5elr3fCJ7VKsf1tRCGlsaT1Jc5SapZl0sMEQYL26r8bqQ3xt9z9FXpNPjmpNaGlsaT3JIlJukmnWx6GoxlK7JQM2xprqC2DUntTS2NJ6gjHYVIoknidWzbpL9jGFRE4R6eOzvYxhSZWqOUkpWxqk5caSxpfEkpVVukmrex0LTAySaRmTM8/dYXnOv5lhTXUHsmpNaGlsaT1BGXTlKiimAlWN6UAfOKdha3GvEbqk5ohKd72sajjS2NJ7k0Cg3STXvY1Hjg7HhzI/W4crvs+AR1Bx5XbrLrTmppbGl8SQHQ7lJqnkfC42Pmh7kwTGWwZj5G61/nwWPoObI69Jdbs1JLY0tjSc5GMpNUk15LDRGHzmU79eTPFZzlFSzIlbNSS2NLY0nKatyk1TzPhY1PZr2kWNlfl2pYzVHKSUr49Sc1NLY0niS0io3STXvY6Hp4T6EmCoPtfPz5+eR83cxZlqM+T2ynNRXmSNMjFdtjuoXDmpOamlsabwLcgWbKLegNC8pANODMcEtdC9Rwhwffxfzu8y2n3/mpxkfDzOPg3lM/8wv45BfZ46vOAMkJqQERqjv0tjSeCHeV/KV2xXVXt9GxBy3Bz3QG4v3858x5sm+Xwl11BwbjLvEhJTACHVVEhuwJPFCnK/mK7eryrVv568q8dyCfWiFGWMJeP/9/NpL6cE3SmbpqOYYU1OoTGJCSmCEuiOJDVi4heK9Ml+yr9APcgvrdrekud0m9GIAuloMpYsoLn/Nn8doRjDXf5OBu41w33H+8zDcdbWaY5G61ypLnPQSGCH2UtgUB9L0OBS7dX4JpwHu1kf+wBiHcb2HFamWXVTCLRv0zSuiKfr7y916zsbAhn/LX2PMDx45ezVHR446BxInvQRGqHcS2CGMUH6IS+38Ej6wwhjp401CDmwTjBHqSP2VcIOYvncHqErRa4KDJojB8NjfY3nuHj7IQB/QDLYcreRGlmFZOtg+BLSX3vwYLY6l+lCLq8Q4xbjdxY9hh8quaH7Ces5mgnNwWpzLZ5hYwzDZJ53OKuQEUJZRqhMaBkZ5PEbu6hCLu9zTPtA0JQv5OJ5X7jXCB9njD3yQjXY8YUwhPUz/zD/mKTXGrmaO2JnSAUdiNfav4vKquLka3uGX2za3Xi7nVL3SeOH6izVBWCXCJINVxzCMZplg6kjecQTcsunom4l/nNKoh3LkjHuOE5SBNrBdMcfH46/5+W/cLqdhFBebXv4+zGOYgphlo8ExZ/L8QfaPmSZNsl7F41Vxc0W9yq+0XWn9XP5cvdJY8fpPa4awWoR6z3nkQt7Oi3M4w/uG4h+fW/SXQ40P+k/Nzy+DctxovViv4H3GfxP/wAXawcOYcf5hXwRXc4wpK1RWetILhc2GucLvShsgdLVddme2iqVxuPpwv5FuUGccRycvdE+ylO8VbcA8YGIjx2FwjzH/CpdWbdAAqdlBHj0GLlxeDsd0u8bvOfonmn+c06kadV7F41VxczUs5Vda3+dxt72Pxx2XxuDqw7cncjYu/pU8jkMMZ5kedkULl/ixLfwFuRj6a8pCZhbKT7HMaReqU2XlCIRhoHFLdaBVOfJ5xb5VH6/EAT1y/0rqxjClcEIxSvH5+nBPMWcLsSjL5zmUYbxbbWpMNO33I1bm16XHOe1CdfJnBY2o6Y9SIHdS5tbLFUcaj8YtxY7Vxwcx9DUQyJP+i3FIxdoeM9iHRn461faV5WhMuA9xSZXH2o3/Hbce8FYD3dNvy1AcNUeqxpemcyZlTh2Ur1ZdxM/Zl3AAPK4+rBnhNZ5xmPZXQOAyexrgWxZT8B3IHH5cHY4DV4/LezzgYRG/Md+M4yBekgemB/3Gzb/XiKSumiM8kY7dcsAy7h0oNUdU/4v3qUmZKvelq13fj8cdS3CA13fADNd3GXE9Bpa5vgoCZalv0XDcQnmlnB2cZTLG2+z90hm+Jvf+f1fN8U7P1RzvqPchbWOTMlYW6n6rNqH4kF/Kgau/5oEZhv6exXFCSJDPcYjVT5fBk9j3ezEc++WvKkEf3EIrTGyLe/juNH3Pm7sdAq/70DrYVs0RlfjifWhShvJTUrVux/Ep5cDVh7yYNUJcrh3Hh+ZBm9It1wxoHEi/YsXlc7h6TLmH0ils2m7V42/2a0Ll5vhcv0+6D+44uydQqhwuSiZycpD2Nh/uejN/sTKmejQLXuKFbzng9yvXY8KJnLyUTog3PNGESxi4ybv/oQ4UYC/sK8FNcC4vl/Wr2lJ+pRy4+na84dL6aS+k9+fWcIbarxBO67dnaNycNBcr1s6f4FxdfFhE9+v90oH9xRkOo8c87Lu/z+WK7bC+fwz5XB7kF5ojmMBkn4itwVZTOO67pMo3Y9wN0Wu/rDeUz/a4rDfEzwXY54L9ikXNkW0MXHaeCd4nc1xjOGbJBukj05+s/nEpy1e3B76lHEL1wSDhAYx92DHO9pyANHw3F8qufIUwFCukc2jy0vrT47E/NILvDsN23C+lNftO+33FY3+f2wtsh/X9Y8jn8iC/0BwxBNkHDW2r45SDaRwrNlvDrrDQcAMm6GCQ2BeS62oAnjZ6PBwsn6d/DHMCVtDIezX51Qw9w3dw+zygk5Wmr7LtAaOUQ7z+cnrYcecHJyBW6Za+rIaVg7+RK5mrg1m5HTUmmqZhIR/1SutAW67GR1/lgdd26DHM2Wqv8thLUrLCcqmBh4zHCow1OdcQrXl5l6Jcnh8n6xgNze7D5mg5Uw5J3oc5rubr3WrIIve6SmgMuM9lgidsyT4XG+qV8qHYpW25+nAK9GwvvfOj4xFKoyHinqt3xxzhu9P2qX3i204VXuVZjS18+eiVg8mcjNQ1x3VFRo0LyukxJ19O3mpg1vNi5siVJXlvq0W7IsDVZA6nPuqguUmwQSzObK7gI15p29L4XH0be7vnWBq/RX1rGh3zy9GAGh/oTVeGfpkdj23VTevF48DHW3x7Bj4CyWU1neCHGcFKiDU/u5oKlAFbrpw1GWJatpfr8R6TbROXgyt1Vp+cAW6NnHoIxHKgvDfOI9ybGk4/QoowPe7pCQfpu3+IBzh38RAL9yXcSmNz9W3eAi+Aw2//LfsDvBIeXF3sT8meMwMwj98K/DjOtfLQAGn/bL+8N9e5PClO8FuPXjgLvc8G51LSmsd2X+S00tseTkRWc9ZguHJrmP7K6rwypJfiQXMuUcY3t6A5nrnYMEneh6Fb7lzfS/g2rOtP0DuhrZkQU8Tju5hXcErbcPWPvMXeHlp/IHU1yRqX20e8PMUOw2jDL4/VvVpHn1ycUL5b69pRCHs3x1xYa3yMYWL7aDlnSjbPM8y9XsCsMFjmHu45wInHbuTeIjVlB3rnQ3Id3oc5Qo31w8HrE2naWxJ1ucOLTuxQuhQfcXBf0r60DVf/lPec7djalST8i4T5KXqVcIqX6PBpUlfml6BzqZj2gaZ9sFiZX7f0OIRdZo6cSVAmqXI0jt2QXFM5oMhlasSIj/qFKZZniMuKbQ0vyNtvux6f768W8mxcvXRyIj2/XeoY28X2FIOmY21oWWkbrj6Xt8ZYV2rwoQuvzEj9hePxEUKTGp5awwf9zo+7ZuQhm+diH3AfIpAqD7XLyQ9hl42sNRV+BXY86IiUW6abceBKbjccrxvwPdFaf6w5wio1dr8wxts3R3zVZ2AeQNXqlAxu6QSFqH6b1HGK6d32HKfSmHkYcHEt8vKtpef3O8U5NKmPdrL8Dly5FPQB+o0bvfdIo6T7Smsf6cffxd4vhnvGwW04/7guIJSZ4xFTUx+sQMkkxZM6Z58jGReby0thlbbh6sPqq+UfxyEWvzW/GJfaZVfNUX+Vp/bIfCF+6USlEl1tG2oXyqcx/XRpm+L6oSsen0jBcSmHGPRjWtgfU4i16bnsqjne6ZOuHO+o9+Ftr07WK+1ibWJloSEobcPVh+9Phzaoj2UhDqX5HIcYBsbn9vCtj/nnV+z1oxiPWmX+JTfog1vo8luSi5qjpJofiFU6YUGC0jap+qlyTvbSNlx9+P49bPAKj79Bfczj4l/J4zjEcODnyLL4cb/HFQPupIyuFkPpmlTVHGuq+yHYpZO2pH5O3Zw6vtSlbbj6cE8PHtIN42iW57z+6O22t/Uxzw9+8ZjjEIOK8Xs8BvP7s3GOgXRWRk0QqOGxv29Bu4o5wiDTrUVHNEZdBUombm5d6XpUgVxsbBOuv9h3G+2/SiAPpsP1EbF8fw2T54dmUs6ibQvKk6aRBeb5eyyvua9mjpT0tUGnCJruQQHJcSzBKqmLOkGb0g3bsvvn+i8T4HUQeEHmCicWl2TewiT8fsiKi8B3mcwxPaiDYyl1rxE+51LfclJz7PKU6ZfUrQm8dasUo7R+TL17WM/120/wu46CL38j3/uYwO+x/eak+yMOGKO3PTU+6D9nfrQOVx7rE/cvEOy7j/DPyLZvOYVuyao5xpTVMlaBO5P4StsrbVjiUiu+ZVp/SDYU5GK+WD93fqFpf5FghWZofNT0IA+OsQx08TdaP0YLsbAOGOMEL33/W/8h2d/HYH/fkVOqijkCEdoZJKb7z1HgykS+0gbPJSnlrnKQih/D6ZlbjLdkmW9miB3Kx/LQ3m+3Hv8j1Zf9oQ/JtMlq5gjoOti+3J91XDK+JXV9le60rYnlY989luznXS6t2lPzomk/fqzMr0uPod0P+W45h8PlAYaaI1VS08UK5EzonDqxwHfbU2xJLIorke6Zm0T/OAw0JtxzdSAvVR5rN4z/Hd+rZr5HHcJWcwypqvnZCsQmdawsN4AEBsaSxEJMqX3P3KT66OOAMUG/cQvdSwwZmI93Ol7+2h/ehndCYYNf16K/bLssT/Oc/xj3v1uvKGqOJzU144oC3MTm8qSwr+BAGylOV+PH2vXMLca7Rdllc0ySC7/Qo+aYFE8r5CoAk5tuue1S9SRNQxIrxbu0vGdupX2Rrl/PHMNM1RzD2mjJBQXQHC80DTaRNA1JrCDhiwU9c7vYpeJmIRMM5RcHKGig5lggllbNU0B6kkviSWLlqZFfq2du+b0oq0lNj6YBBY5BE24L3Zssix6vreYY10dLLyggPckl8SSxLkgTbdIztyjxG4VoiLinUDQvlKb1pdNqjtKKKp74Qw9J05DEkh7qnrlJ9xXxwPSg37j5K0I0RX+P7Wvu1Rxrqvul2NKTXBJPEkt6eHvmJt1XxENzpKaIRgh1MO3vsX3NvZpjTXW/FFt6kkviSWJJD2/P3KT7GsJDE6TlkAfawEZNlNapkVZzrKHql2NKT3JJPEks6WHumZt0XxGPmiFNYzns1RypGpp+awWkJ7kkniSW9CD1zE26r4iHhoh7zIc9NUXQhm4tVpC6cqSjoWkRBaQnuSSeJJaIWASkZ26EpmjSN8CQ6XHmKUqEAVNzZETRrHsKSE9ySTxJrHsqnVv3zO3Mtm2OmmNbvTXapgBMSqkNIHGSS2EinsSASWJJ8KEYPXOjPF+RVnN8heoaczezu1Lg5Pb3d3El2yM3SUwprJ65SfXxKo6a41XltN0tBSQnJWDhdotUpcaSfZWm2DM36b6W4qk5liqm9UUUkJ6U0ngindxAlJukmu2w1Bzbaa2RiALShiGNR6jeTiq32xK+BEDN8SWya1Bpw5DGkxwh5SapZjssNcd2WmskooC0YUjjEaq3k8rttoQvAVBzfInsGlTaMKTxJEdIuUmq2Q5LzbGd1hqJKCBtGNJ4hOqtJPDC7RZQpca96lapu0Wwao5FcmllKQWkJ6U0nkQ/0RTpXgJXCqNXXlL9u4uj5nhXQW1/SQFpM5PGu9QprxE1H0x7VV52iHzo/mVkOg38keZIB1zTx2Vdb1pIzone+qZ8+j3vSsYm9KMUkucuxar6wxM0kKZVgVcrQCfiq7nQ+JQXpmm5pl+jgJrja3TXqKqAowCaIuz1rw8FdCT6GAdloQqoAp0poObY2YAoHVVAFehDATXHPsZBWagCqkBnCqg5djYgSkcVUAX6UEDNsY9xUBaqgCrQmQJqjp0NiNJRBVSBPhRQc+xjHJSFKqAKdKaAmmNnA6J0VAFVoA8F1Bz7GAdloQqoAp0poObY2YAoHVVAFehDATXHPsZBWagCqkBnCqg5djYgSkcVUAX6UEDNsY9xUBaqgCrQmQJqjp0NiNJRBVSBPhRQc+xjHFwWy2SGaXHztqNlGgxf9DTzmPhR03E2zx0V6k8GopwxFzMNo5mPynurz0+ALtj3hKaOnocyz3k0Y1Q80JeOFcbjxuLA1VRbBdQc2+odjQYmRX/XL5keZ4J3mB3JPJLP2YzOZD7q7+YIpuxMWuSzmugBdk6tPuqZCXFx2zcnvjEGOA1ns7d1SVsaLVzmxd76gTC2ndc33sAA5zArGtuYxUx+H9wK9ijLHHccEo/VfzLLLxNEs6oroOZYXeILAS6vHCMmlmmOaBhgJquxwOSN4JLuLRM1lXV1hHjGTnwPB80AHcxirSa3tyP4kEyZY6ydX7Ya5sFp5X+Y1dnkGHPcDJ7/UMEPF9h72pzMcVtNEi0g/mNajHqjdxI0OlRzbCR0URg0DW+lgxOQzB8Cu5oK1mH3+4SEZofp7UYYjHsYCAmYTALubkjMKtGWj6MZKC9bjxqJG8YaGitA2lR3LgQSDAjjr2a4bCvHwySP6gFzpPztgti/rPaxzpfV07S2oWPxGGfzcwTXVGMF1BwbC54VDkyKNYDYPanD7NgY7MrRW9nM025mxyowgcsGw0tmanKAQ8zSmvNgphkurUk96LtnNjSEtDmul/ZbfKv7vJrj4t+GABaC5gh9PI3JFsN+KOrlNB33V6TVHF+heipmcAW3mlnAN1OoXjljeguaI5ShYTH1PKTjkK6IzqtNukpbTQnqrKaJfQqb3xolXL7iuCvmgwO041aO1vDwvqc1q8lM42Rm9qFKwBwDK3yXC+p5qGU1cD4Ijktr20/LSy+qiWJNk2qOTeXODOasHGHCuJMcjWRHs5eidBU47CtPnGTHRMVJyphe0JSP+HvMVGLj5BiSxd+wSB8Pw3ONkgtx1PVL17ZOPFIF2vFlqyEdmrp6EwjZlSOM6WncfJ2hTw87lmqR7ki0OFJzbKHyrRixyboB2xUPeU3HM55j4sNko+Z4GOpRJ3bpXtYRZ6Vomx5G5JgV8MXLTPJBwEUTN0drUKjJdjtgHM3I8gisHJ3VHzyEz7nnuJnj3nY19+NDbBsbfSDDnQZN8tQcm8icF8SaSdYl2jFxLPIlczxMFwzHmuO2klmN8ijPY3+udTbH1XjHefbeo4RYo5nn+P1GiCBtjie8zahneK2KfmLY7gXMMWvMiAHDvUtcOTrmSOvYzurT6vNp1SxHzbGZ1BcC2RXgZI1jjL1Oc8UcrRGul3HWHKfQO46bEe+TONQP3zjAAJhLWWs+/spsuySGFVv05WlJc8SVGr2UXfOODwd8nQn77PcRV5pk1c4+rd7a2/G0r92rOaKkHe/VHHscHJhEsBqxsxRXcKvZDNzl3rbicy7JtlWPXRk5K5ttdbJP1NBlNMYtEAh5b/FOCy+AQq5eIa6avexT8HN/hu3pNprdcasA9ECz5dph2R4E+NMPAeBKCcExLd8buonzZfVabj+E7BefVm3hoQ+O2bTw/OEc0PuNrr6tjtQcWymdEWefwHRC4iXY3h5NEs2TWb0EjQ8m4GqOx6s6gua4c3zPxGFelL9rWidDpVUxjR8AzocSmPaxUqfGvTY7xgZh4MV5fQl8V6N5Qs2xueQaUBVQBd5BATXHdxgl5agKqALNFVBzbC65BlQFVIF3UEDN8R1GSTmqAqpAcwXUHJtLrgFVAVXgHRRQc3yHUVKOqoAq0FwBNcfmkmtAVUAVeAcF1BzfYZSUoyqgCjRXQM2xueQaUBVQBd5BATXHdxgl5agKqALNFVBzbC65BlQFVIF3UEDN8R1GSTmqAqpAcwX+B2aGxFXitma8AAAAAElFTkSuQmCC" alt="" /></p><p style="line-height: normal; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><span style="font-size:12.0pt; font-family:&quot;Microsoft YaHei&quot;,sans-serif;Times New Roman&quot;">市面上几乎所有的小功率</span><span style="font-size:12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Times New Roman&quot;">LED灯泡全是按照这种阻容降压整流再点亮LED的原理制作的，当然，全是绿色节能的&#8220;典范&#8221;，符合某国一级能耗标准。市面上大部分小功率5V充电头的功率因数接近0.5，远超普通的小功率LED节能灯，用来DIY小功率LED灯再好不过，借着一堆认证的优势，轻松把那些品牌小功率LED灯全部踩在脚下。<br /><br /></span></p><p align="center" style="line-height: normal; background: white;"></p><div style="text-align: left;"><span style="font-size: 12pt; line-height: 107%; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">下面以做一个小夜灯为例，论述一下利用起来手头闲置的</span><span style="font-size: 12pt; line-height: 107%; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">5V充电头。<br /><br /></span></div><span style="text-align: justify; font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;"><div style="text-align: left;"><span style="font-size: 12pt;">小夜灯固然</span>卖的<span style="font-size: 12pt;">(尤其网上)很多，而且便宜，高价的当然也有，适合高品位时间不富裕的人士。</span><span style="font-size: 12pt;">DIY一个低耗电光线柔和的小夜灯难度很小，却能解决漆黑夜晚上厕所</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">看不清路</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">[</span><span style="font-size: 12pt;">开灯太刺眼</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">]</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">的烦恼</span><span style="font-size: 12pt;">。</span><span style="font-size: 12pt;">考虑到多数年青人手头充电头一堆，太多了根本用不上，扔了不仅可惜还危害环境&nbsp;</span><span style="font-size: 12pt;">[外面的塑料或者树脂壳子很难自然降解，里面还有各种电阻、电容、电感、IC等元器件。电阻和电感上的漆皮、电容的电解液等都严重危害环境，IC封装的树脂也很难自然降解]，留着没什么用还占地方。于是打算就用</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5V充电头供</span><span style="font-size: 12pt;">电长明</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">(</span>商业上<span style="font-size: 12pt;">一般小夜灯的方案是</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">220V</span><span style="font-size: 12pt;">阻容降压点亮</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt;">，耗电大效率低，高档一点的还有红外、声音等感应功能，耗电更大效率更低，因为感应电路需要始终通电，这部分功率远超</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span>光源自身<span style="font-size: 12pt; font-family: Arial, sans-serif;">)</span><span style="font-size: 12pt;">，光源来自一个</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5</span><span style="font-size: 12pt;">毫米白光</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED(</span><span style="font-size: 12pt;">拆自坏玩具车车灯</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">)</span><span style="font-size: 12pt;">，串一个大约</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">1K&#937; 1/8W</span><span style="font-size: 12pt;">电阻防止电流过大烧毁</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED [请注意拆件下来的电阻阻值，尤其色环电阻比较常见，在没有表而且电阻上没有标注阻值的情况下，可以考虑人工算出色环电阻阻值，网上查查各种色环代表什么意思]</span><span style="font-size: 12pt;">。因为</span><span style="font-size: 12pt;">草帽头白光</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt;">导通电压</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">3V</span><span style="font-size: 12pt;">左右，工作电流一般不超过</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">20</span><span style="font-size: 12pt;">毫安，</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5V</span><span style="font-size: 12pt;">电压供电时，限流电阻最好不要低于</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">100</span><span style="font-size: 12pt;">欧姆，电阻过小容易烧坏</span>LED<span style="font-size: 12pt;">。</span></div></span><p style="text-align: left; line-height: normal; background: white;"><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">考虑到长期通电，设计上需要尽可能降低损耗，测试过几个闲置的</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5V</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">电源的损耗作为候选。这些电源每个上面都有一堆几乎相同的认证标识，但实测结果嘛就是另外一回事了</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">... 值得一提的是这里计算损耗用伏安</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">VA</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，而非业界流行的瓦</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">W</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">。其实小功率开关电源即使满负荷，功率因数也极少超过</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">0.5</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，空载更是惨不忍住，很多国货不足</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">0.1(</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">甚至低到</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">0.01)</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，不用瓦</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">W</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">计算怎么去遮丑低效的电路呢？商人都懂质量好未必收益好，无底线的虚假广告</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">+</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">软文宣传是赚钱的法宝，其实何止</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">光源，这是时代的商业文化，起码这片土上如此。<br /><br /></span></p><p style=" text-align:justify;text-justify:inter-ideograph;line-height:normal;background: white"><span style="font-size:12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;;color:#303030">适配器实拍</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">[</span><span style="font-size: 12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;; color:#303030">旁边是一个</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">5</span><span style="font-size:12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;;color:#303030">毫米草帽</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">LED</span><span style="font-size: 12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;; color:#303030">焊了一个</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">1K</span><span style="font-size:12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;;color:#303030">欧电阻和</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">USB</span><span style="font-size: 12.0pt;font-family:&quot;Microsoft YaHei&quot;,sans-serif;Microsoft YaHei&quot;; color:#303030">口连线</span><span style="font-size:12.0pt;font-family:&quot;Arial&quot;,sans-serif;Times New Roman&quot;;color:#303030">]</span></p><p><span style="font-family: Arial; font-size: 12pt;"><img src="http://www.cppblog.com/images/cppblog_com/chipset/5V-adapter.JPG" alt="" width="800" height="871" /><br /></span></p><p>&nbsp;</p><p style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 12pt; font-family: Verdana, sans-serif; color: #303030; background: white;">5V</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">适配器损耗实测，容易看出基本分两档，有些电源可真不敢恭维，功率低</span><span style="font-family: &quot;Microsoft YaHei&quot;, sans-serif; font-size: 16px;">[没准还虚标]</span><span style="font-family: &quot;Microsoft YaHei&quot;, sans-serif; font-size: 12pt;">损耗还大。</span></p><p style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">理论上能耗等级越高越好，个别厂家乱标的当然也有，这里就不说是谁家了，没有标注等级的一般低于III级。</span></p><table border="0" cellspacing="0" cellpadding="0" align="left" width="576" style="width: 6in; background: white; border-collapse: collapse; margin-left: 0.1in; margin-right: 0.1in;"><tbody><tr><td width="205" valign="top" style="border-width: 1pt; border-style: solid; border-color: black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">候选电源</span></p></td><td width="150" valign="top" style="border-top: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">220V</span><span style="font-size: 9pt; font-family: SimSun;">侧电流</span><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">(mA)</span></p></td><td width="114" valign="top" style="border-top: 1pt solid black; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><font face="SimSun"><span style="font-size: 12px;">能耗等级</span></font></p></td><td width="107" valign="top" style="border-top: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">备注</span></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">苹果手机充电头</span><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 1.0A</span></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">0.173</span></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">V</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">带载</span><span style="font-size: 9pt; font-family: SimSun;">LED</span></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">微软手机充电头</span><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 900mA</span></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">0.254</span></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">V</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">带载</span><span style="font-size: 9pt; font-family: SimSun;">LED</span></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">Mophie&nbsp;</span><span style="font-size: 9pt; font-family: SimSun;">无线充电源</span><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 3.0A</span></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">0.234</span></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">VI</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">带载</span><span style="font-size: 9pt; font-family: SimSun;">LED</span></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">老飞利浦手机充电头</span><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 650mA</span></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">0.356</span></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">无标注</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="font-size: 9pt; font-family: SimSun;">带载</span><span style="font-size: 9pt; font-family: SimSun;">LED</span></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">TPLink</span></strong><strong><span style="font-size: 9pt; font-family: SimSun;">路由器电源</span></strong><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 600mA</span></strong></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">1.221</span></strong></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="color: #303030; font-family: Verdana, sans-serif; font-size: 12px;">无标注</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: SimSun;">空载</span></strong></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: SimSun;">水星路由器电源</span></strong><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 600mA</span></strong></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">1.220</span></strong></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="color: #303030; font-family: Verdana, sans-serif; font-size: 12px;">无标注</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: SimSun;">空载</span></strong></p></td></tr><tr><td width="205" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: 1pt solid black; width: 153.9pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: SimSun;">杂牌台灯电源</span></strong><strong>&nbsp;</strong><strong><span style="font-size: 9pt; font-family: SimSun;">海尔</span></strong><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">5V 550mA</span></strong></p></td><td width="150" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 112.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;">0.977</span></strong></p></td><td width="114" valign="top" style="border-top: none; border-right: 1pt solid windowtext; border-bottom: 1pt solid black; border-left: none; width: 85.5pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><span style="color: #303030; font-family: Verdana, sans-serif; font-size: 12px;">无标注</span></p></td><td width="107" valign="top" style="border-top: none; border-right: 1pt solid black; border-bottom: 1pt solid black; border-left: none; width: 80.1pt; padding: 0in 5.4pt;"><p style="margin-bottom: 0.0001pt; line-height: normal; word-break: break-all;"><strong><span style="font-size: 9pt; font-family: SimSun;">啸叫</span></strong></p></td></tr></tbody></table><p style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 9pt; font-family: Verdana, sans-serif; color: #303030;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;"><br /><br />最终选用了淘汰的微软手机充电头</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5V</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">供电[实际大于3V就行]，实测总输入功率</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">0.056VA</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，即使功率因数</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">1.0[</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">实际远远达不到</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">]</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，算下来</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">1</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">年消耗不足</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">0.5</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">度电。</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">发光亮度跟月光接近，对我而言刚刚好。如果觉得光线还不够柔和，</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">可以用保鲜膜包一下</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">(</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">或半透明热缩管封一下等措施</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">)</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">。</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">5V</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">电源负载率很低，</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">LED</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">耗电占总功率的</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">15%</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">左右，电源自身损耗占了大约</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">85%</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">。如果觉得光线太暗，可以适当减小电阻增加电流从而增加亮度，例如</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">1K</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">欧姆电阻改为</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">680或</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">470</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">或</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">330</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">或</span><span style="font-size: 12pt; font-family: Arial, sans-serif;">220</span><span style="font-size: 12pt; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">欧姆等。<br /><br />原理就这么简单，如下图。<br /></span><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASUAAACpCAYAAABtYitgAAALE0lEQVR4Ae3dDZKjIBCGYc/lgXIeT5PL5DBsEcMsmhZpI43Iu1UpIyI/D85XJpPJDo5/CCCAwIUEhguNhaEggAACjlDiIkAAgUsJEEqXWg79YIZhcD099EKc0ZoAodTaiq3G6wOpl389zbWXNZXm2c8VLc3+BmU9/aD2NNcbXJqHp0AoHaa7xok9/aD2NNdrXF11RkEo1XE/rdeeflB7mutpF0iDDRFKDS5aPGSLH9TXNApvpo9uesUjKf/cYq7lZ0EPewKE0p7QxY9b/KDOofRwz8hiLrMNJou5RlPkaSUBQqkS/FndWvygSqHk3NM9hsGNhrdLFnM9a11o57gAoXTc7hJnWvygEkqXWOpuBkEoNb7UtULp+fAf2ly+pCtNaTHX0nOg/X0BdSj5C4PHtQz2l/m3GvOd0nLOj/gNpt+azz6b6265Bq155C70oVDKbZx65QX8hVn63/rlW427JD9Hi7mWtuy1fc3aqa9oTeO9LoDlvC3WYx1K4U3uwfh2yWKulmvXU1+atSOUGr8yNIt9dKrfoeScez7edy6WuWQx16NGnJcW0KwdoZS2vPxRzWIfnYwYSu7lpnFwwzg5q89QWsz1qBHnpQU0a0copS0vf1Sz2EcnI4eSc+41udH/4sPodslirkeNOC8toFk7QiltefmjmsW+/GR2BtjTXHcomjusWTtCqbnlXQ5Ys9jLM9vb62mu7a1OesSatSOU0paXP6pZ7MtPZmeAPc11h6K5w5q1I5SaW97lgDWLvTyzvb2e5tre6qRHrFk7QiltefmjfrF7elx+QRigKEAoiSwUIoBALQFCqZY8/SKAgChAKIksFCKAQC0BQqmWPP0igIAoQCiJLBQigEAtAUKpljz9IoCAKEAoiSwUIoBALQFCqZY8/SKAgChAKIksFCKAQC0BQqmWPP0igIAoQCiJLBQigEAtAUKpljz9IoCAKEAoiSwUIoBALQFCqZY8/SKAgChAKIksFCKAQC0BQqmWPP0igIAoQCiJLBQigEAtgWKh5BsOj1qTo18EEGhPoEgorRtd77fHxIgRQMBKQJMX2d/RvW50vW81OfpBAIH2BDR5QSi1t76MGIHmBIqEklfwDYdHcyoMGAEEqgkUC6VqM6JjBBBoWoBQanr5GDwC9xMglO63pswIgaYFCKWml4/BI3A/AULpfmvKjBBoWqBgKD3dY3i4Z9M8DB4BBKwFCCVrcfpDAIGkAKGU5OEgAghYC5wbSq/JjdGHJn3j8ePBaznr9aU/BJoTODeUFtPnPaUFBzsIIJAlQChlMVEJAQSsBAglK2n6QQCBLIGCoZTVP5UQQACBhQChtOBgBwEEagsQSrVXgP4RQGAhQCgtONhBAIHaAoRS7RWgfwQQWAgQSgsOdhBAoLYAoVR7BegfAQQWAoTSgoMdBPoTeE2jGxLf6DEfX/7JmA+O8Gdj8vHRTa9jloTSMTfOQuA2AlmhNE5uK2Pe56+Ph7+DDcml0CKUFFhUReCOAkVC6Q3l//51cKPylolQuuNVxpwQUAiUCyXn9tqWhkkoSSqUIdCRwF5wvI+vX55FPsnj75dxuveXCKUIl6cI9CiQFUqr70aL3xjfD6X/b4rn+BJKOUrUQeDGAlmhxJ3Sja8ApobAxQRKhtJe2xIFd0qSCmUIdCSwFxzv44fulPjtW0eXEVNF4DyBIqH0fMzfz8/nlM5bKFpCoBeBOZS+P7E9fALl2PHj/+cjL996ufKYJwKNCBBKjSwUw0SgFwFCqZeVZp4INCJAKDWyUAwTgV4ECKVeVpp5ItCIAKHUyEIxTAR6ESCUellp5olAIwKEUiMLxTAR6EXANJSej/gDWvLXGcx1tj549XLTOLjwoa5eFol5ItCTgFko+U+Fxp84nz8lKgTT5+Ppcd2/Bfl8xaZ47K8STxBA4MoCPnR+ecRzG+Kd+bn/gzshWL4rfpdsBsz8R3zS3dAcZFt3Ud9dUIIAAjYCqrubQYiSaJipttbH5JbCH95pv4t3M5S2vkJzfumm/b7faK48RQCBAgLroMjpInXO1jGpXA6lvxF87nD8rVniaw7m6jvvDUmB9S47eFf2N0aeIIDA2QJSWOz1kTpn65hUvhNKYRifwPkKpk/55/Vk+o7nO7TeL92+2gx9skUAgRoCUlDkjmPrXKlcKvP9pEPpc3fjT96/Uwov0ba/u3f5/tEcUukgy6WgHgIInCWwFRY57W+dK5VLZb4PMZTm8JjfTdeGxvvX/1u/SotfwvHSLWeNqYOAqcBWUGgGIbWRW+b7EULph9++OeeSoRQdfwffVnhpBKiLAAKnCEjBcaRhqZ112Xo/7kcIpfhw6rkPr+Wv8sMdVjJr/G/2xod7jNsv81K9cgwBBMoIpIJC2+O6rb39uP0fQsn5N5HcuPjQ1DKk4o7+Pw+/0cup+/8sniGAQDmBdWj82tO6vXg/fi7181soSS1ShgACTQnshcTRycTtbj2X2iaUJBXKEOhIIA6MvWkfrRvOC9tUP4RSSodjCNxcICckAoGm7vqccG7YhuPSllCSVChDoBOBnJAIFJq663PCuWEbjktbQklSoQyBDgRyAiIwaOqGc8LWnxseoSy1JZRSOhxD4KYCmpDR1JW4QiDltkMoSYqUIXAzgXUgrPdT09XU3WpH0wahtKVIOQI3EohDIX6+N8Xcur7er48wFkIpSLBF4MYCIVzCNneq2vpb7WraIZS2FClH4EYCIRTibXi+Nc2941vnSeWatgglSZAyBG4m4EMhBEPYpqaYUyd1/vqYpj1Caa3HPgI3FPChEB4509OEyNntEUo5otRBoHGBmoHk6TQhRyg1frExfATOFNCEh6ZfTbuEkkaWugjcXEATHhoKTbuEkkaWugjcTCAOi/j52dPUtE0ona1Pewg0JBCHRfz87Clo2iaUztanPQQaEghhEbalhq5pn1AqtQq0i0ADAj4s4sBY7581hbiPvTYJpT0hjiNwY4EQQmFbaqqEUilZ2kXgZgKlwyhwEUpBgi0CCFxCgFC6xDIwCAQQCAKEUpBgiwAClxAglC6xDAwCAQSCAKEUJNgigMAlBAilSywDg0AAgSBQIJRebhr/fx/LMIxueoXu2CKAAAJpgQKhlO6QowgggEBKgFBK6XAMAQTMBQglc3I6RACBlAChlNLhGAIImAsQSubkdIgAAikBQimlwzEEEDAXIJTMyekQAQRSAoRSSodjCCBgLlAslHzD4WE+KzpEAIFmBYqE0rrR9X6zWgwcAQSKC2jyIvvrcNeNrveLz4oOEECgWQFNXhBKzS4zA0egHYEioeSn7xsOj3Y4GCkCCNQWKBZKfmKaxmtD0D8CCFxDQJMb2S/fwtQ0jYdz2CKAQN8CmtwglPq+Vpg9AiYChJIJM50ggECuAKGUK0U9BBAwESCUTJjpBAEEcgUIpVwp6iGAgIkAoWTCTCcIIJArQCjlSlEPAQRMBAglE2Y6QQCBXAFCKVeKegggYCJAKJkw0wkCCOQKEEq5UtRDAAETAULJhJlOEEAgV4BQypWiHgIImAgQSibMdIIAArkChFKuFPUQQMBEgFAyYaYTBBDIFSCUcqWohwACJgKEkgkznSCAQK4AoZQrRT0EEDARIJRMmOkEAQRyBQilXCnqIYCAiQChZMJMJwggkCtAKOVKUQ8BBEwEioeS74AHBlwDXAOaayA3/dT/71tuw9RDAAEEjggQSkfUOAcBBIoJEErFaGkYAQSOCBBKR9Q4BwEEigkQSsVoaRgBBI4IEEpH1DgHAQSKCRBKxWhpGAEEjgj8A1K08XUVvL0jAAAAAElFTkSuQmCC" alt="" /></p><div><span style="font-family: Arial; font-size: 12pt;"></span></div><br /><span style="font-size: 12pt;">夜间实拍</span><br /><img src="http://www.cppblog.com/images/cppblog_com/chipset/light-in-darkness.JPG" alt="" width="800" height="825" /><br /><span style="font-size: 9pt; line-height: 12.84px; font-family: Verdana, sans-serif; color: #303030;"><br /></span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">容易看出，以上方案需要的部件不多[供电头，线，电阻，LED]，操作简单[接上就行，如不亮换下LED方向再接上就亮]，废物利用[用不上的充电头和线、废玩具车车灯和电阻]，成本低廉[元器件不花钱]，耗电极低[上面的是0.056VA]，光线柔和[月光相当]，更重要的是安全高效</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">[</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">手机充电头各种国际认证可有一堆，业界那些廉价低效的小功率LED灯电路能过什么级别的认证</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">]</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，供电和发光部件可以</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">USB</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">插接分离，灯坏了换灯，电源坏了换电源，</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">LED</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">也可选喜欢的颜色，电源当然也可以非</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">5V</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，常见的</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">9V</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">，</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">12V</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">等均可，甚至可以用古董铁芯电源，就算交流输出也行，无非并联</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">2</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">个</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">LED</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">极性相反都亮(封装在一起的双向LED也有出售)。<br /><br />如果用较大功率的灯盘替换简单的</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">&nbsp;LED+</span><span style="font-size: 12pt; line-height: 17.12px; font-family: &quot;Microsoft YaHei&quot;, sans-serif;">限流电阻方案，长明灯摇身一变就成为照明灯，用更大功率的充电头供电以及更大功率的灯盘，照明灯功率也会更大</span><span style="font-size: 12pt; line-height: 17.12px; font-family: Verdana, sans-serif; color: #303030; background: white;">。如果用成串的彩色LED代替上述普通白光LED+限流电阻，加个时序通断电路就能起到装饰作用。<br /><br />如果用两节1.5V的5号电池供电能让上述发光器件(一个白光LED和一个1K电阻)连续亮一个月不止，即使一枚3V的纽扣电池也能连续亮一个星期以上，如果用电池夹或者热缩管固定好再加个开关，就成为一个简易的手电筒。</span><img src ="http://www.cppblog.com/Chipset/aggbug/217855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2021-11-06 22:18 <a href="http://www.cppblog.com/Chipset/archive/2021/11/06/217855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>茴字不止4种写法 -- C++语法渣一样</title><link>http://www.cppblog.com/Chipset/archive/2021/10/29/217844.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Fri, 29 Oct 2021 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2021/10/29/217844.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/217844.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2021/10/29/217844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/217844.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/217844.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">不知道标准委员会那帮家伙们干嘛把C++语法搞那么复杂，你倒是多增加一些库不行吗？语法整这么复杂除了增加编译器和Code Review</span><span style="font-size: 16px;">的成本还</span><span style="font-size: 12pt;">有个P用？<br />就拿调用说事吧，下面仅列出很少一部分写法。</span><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">int</span>&nbsp;foo(<span style="color: #0000FF; ">int</span>&nbsp;n)<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;s&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(;&nbsp;0&nbsp;&lt;&nbsp;n;&nbsp;--n)<br />&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;*=&nbsp;n;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;s;<br />}<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;C<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;C()&nbsp;=&nbsp;<span style="color: #0000FF; ">default</span>;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">explicit</span>&nbsp;C(<span style="color: #0000FF; ">int</span>&nbsp;a)&nbsp;:&nbsp;y(a)&nbsp;{}<br />&nbsp;&nbsp;~C()&nbsp;=&nbsp;<span style="color: #0000FF; ">default</span>;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;foo(<span style="color: #0000FF; ">int</span>&nbsp;x)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;+&nbsp;y;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y;<br />};<br /><br />#include&nbsp;&lt;functional&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(*f_int_t1)&nbsp;(<span style="color: #0000FF; ">int</span>);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;old&nbsp;style</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;f_int_t1&nbsp;foo_p1&nbsp;=&nbsp;&amp;foo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&amp;&nbsp;is&nbsp;redundant&nbsp;and&nbsp;optional</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;f_int_t2&nbsp;=&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(*)(<span style="color: #0000FF; ">int</span>);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;easy&nbsp;to&nbsp;understand</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;f_int_t2&nbsp;foo_p2&nbsp;=&nbsp;foo;<br />&nbsp;&nbsp;std::function&lt;<span style="color: #0000FF; ">int</span>(<span style="color: #0000FF; ">int</span>)&gt;&nbsp;stdf_foo&nbsp;=&nbsp;&amp;foo;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;modern</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;Sep("&nbsp;");<br />&nbsp;&nbsp;constexpr&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;5;<br /><br />&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"global&nbsp;function:"&nbsp;&lt;&lt;&nbsp;foo(N)&nbsp;&lt;&lt;&nbsp;Sep&nbsp;&lt;&lt;&nbsp;foo_p1(N)&nbsp;&lt;&lt;&nbsp;Sep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;foo_p2(N)&nbsp;&lt;&lt;&nbsp;Sep&nbsp;&lt;&lt;&nbsp;stdf_foo(N)&nbsp;&lt;&lt;&nbsp;"\n";<br /><br />&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(C::*&nbsp;f_C_int_t1)&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">const</span>;<br />&nbsp;&nbsp;f_C_int_t1&nbsp;C_foo_p1&nbsp;=&nbsp;&amp;C::foo;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;old&nbsp;style</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;f_C_int_t2&nbsp;=&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(C::*)&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">const</span>;<br />&nbsp;&nbsp;f_C_int_t2&nbsp;C_foo_p2&nbsp;=&nbsp;&amp;C::foo;<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;C&nbsp;c(10);<br />&nbsp;&nbsp;constexpr&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;X&nbsp;=&nbsp;20;<br /><br />&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"old&nbsp;member&nbsp;call:&nbsp;"&nbsp;&lt;&lt;&nbsp;(c.*C_foo_p1)(X)&nbsp;&lt;&lt;&nbsp;Sep&nbsp;&lt;&lt;&nbsp;(c.*C_foo_p2)(X)&nbsp;&lt;&lt;&nbsp;"\n";<br /><br />&nbsp;&nbsp;std::function&lt;<span style="color: #0000FF; ">int</span>(<span style="color: #0000FF; ">const</span>&nbsp;C&amp;,&nbsp;<span style="color: #0000FF; ">int</span>)&gt;&nbsp;stdf_C_foo&nbsp;=&nbsp;&amp;C::foo;<br />&nbsp;&nbsp;auto&nbsp;greet&nbsp;=&nbsp;std::mem_fn(&amp;C::foo);<br />&nbsp;&nbsp;auto&nbsp;callback&nbsp;=&nbsp;std::bind(&amp;C::foo,&nbsp;&amp;c,&nbsp;std::placeholders::_1);<br />&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"new&nbsp;member&nbsp;call:&nbsp;"&nbsp;&lt;&lt;&nbsp;stdf_C_foo(c,&nbsp;X)&nbsp;&lt;&lt;&nbsp;Sep&nbsp;&lt;&lt;&nbsp;greet(c,&nbsp;X)&nbsp;&lt;&lt;&nbsp;Sep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;callback(X)&nbsp;&lt;&lt;&nbsp;"\n";<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/Chipset/aggbug/217844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2021-10-29 18:06 <a href="http://www.cppblog.com/Chipset/archive/2021/10/29/217844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A Tool to Compare Two PDF Files</title><link>http://www.cppblog.com/Chipset/archive/2021/10/15/217487.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Fri, 15 Oct 2021 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2021/10/15/217487.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/217487.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2021/10/15/217487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/217487.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/217487.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">杂事太多，一直忙来忙去没时间写点正经的东西。最近写了个工具，用于比较两个PDF文件的不同，把差异点标出来。</span><br /><span style="font-size: 12pt;">后端用Poppler解析PDF文件，然后比较，生成三个html，可用Chrome或Firefox(Edge和IE就悲剧了)打开。<br />查看不同点。</span><span style="font-size: 12pt;">这Poppler虽说免费开源，但Bug无数，真心难用。唉，看在不花钱的份上，忍了...<br /><br /></span><span style="font-size: 12pt;">源代码量3万行的样子，运行依赖33个dll，算法有点复杂，虽然距离我的意愿依旧遥远，但总算见到雏形了。</span><br /><br />下面的截图是简单的比较了两个PDF文件的结果，鼠标点击最右栏就能标出来且能自动对齐变更点，添加或者删除的能对应原始位置。<br /><br /><div><img src="http://www.cppblog.com/images/cppblog_com/chipset/1.png" width="800" height="420" alt="" /><br /><br />下面是个文字变更的逻辑对齐部分截图。文字属性有变更的地方鼠标放上去能弹出不同之处，黑底绿字。<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/chipset/2.png" width="800" height="419" alt="" longdesc="text.html" /><br /><br />下面是单独比较光栅图片的截图，鼠标点击最右栏能自动对齐，添加或删除的则能对应到原始位置，图片变更的会标出所有变更点。<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/chipset/3.png" width="800" height="422" alt="" /></div><span style="font-size: 12pt;"><br />大致就如同前面三个截图的样子(目前缺矢量图的比较)，应该能满足一般的PDF文档比较需求了。<br /></span><span style="font-size: 12pt;"><br /></span><span style="font-size: 12pt;">诸位过客可以下载一个简单用例到</span><span style="font-size: 12pt;">电</span><span style="font-size: 12pt;">脑</span><span style="font-size: 12pt;">上，解压</span><span style="font-size: 16px;">[可以考虑<a href="https://www.7-zip.org/">7z</a>]</span><span style="font-size: 16px;">后</span><span style="font-size: 16px;">，</span><span style="font-size: 12pt;">用</span><span style="font-size: 12pt;">Chrome(或者Firefox，别用Edge和IE)<br />浏览器打开看看效果。</span><span style="font-size: 12pt;">在这里下载</span><span style="font-size: 12pt;"><a href="/Files/Chipset/test.zip" style="font-weight: bold; font-size: 12pt;">/Files/Chipset/test.zip</a></span><span style="font-size: 12pt;"><br /></span><br /><span style="font-size: 12pt;">以上附件很小，麻雀虽小五脏俱全，该有的东西基本都有，可以比较的单个PDF文件1000页以上，且速度很快。<br />以上展示内容用的文字后贴背景页面格式，将来</span><span style="font-size: 16px;">[升级中]解析PDF</span><span style="font-size: 12pt;">用BSD协议的pdfium替换GPL协议的Poppler，<br /></span><span style="font-size: 16px;">页面展示</span><span style="font-size: 16px;">借助PDF.js，但</span><span style="font-size: 12pt;">不再用文字和贴背景这种办法，再接下来做个单机界面，不再用浏览器，算是升级方向吧。<br /><br /></span><span style="font-size: 12pt;">关于比较工具，下面多说几句。<br />做内容比较的工具</span><a href="https://draftable.com/compare"><span style="font-size: 12pt;">Draftable</span></a><span style="font-size: 12pt;">很成功</span><span style="font-size: 12pt;">，用C#写的，可以比较Office和PDF文件，各格式任意混比，只能比文字。<br />我的只能比PDF文件，比较内容是文字和光栅图，有个Kiwi free pdf comparer类似，只不过需要Java运行环境。<br />此外，ABBY的Fine Reader和Adobe的Acrobat也都有比较功</span><span style="font-size: 16px;">能，只不过精度和速度都明显弱一些。</span><span style="font-size: 12pt;">至于视觉<br />比较的工具，由于跟位置有关，大多数场合几乎等同于废物，这种网上一搜一大把，很多免费。纯文本内容的比较<br />工具就更多了，网上一搜一大堆，这里就不必啰嗦了。<br /></span><img src ="http://www.cppblog.com/Chipset/aggbug/217487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2021-10-15 10:39 <a href="http://www.cppblog.com/Chipset/archive/2021/10/15/217487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>留学加拿大</title><link>http://www.cppblog.com/Chipset/archive/2020/07/06/217394.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Mon, 06 Jul 2020 01:49:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2020/07/06/217394.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/217394.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2020/07/06/217394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/217394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/217394.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自知乎，不对真实性负责。基本基于现实生活，细节有加工。原先写这个答案，只是想调侃一下当年我自己和周围同学们留学以及之后移民的经历，因为想着以英文字母代替真实人名，所以只写了不到26个老同学的小故事，但写完后发现太偏颇，都是小留学生转移民的案例，不足以代表广大成年工作后再来到加拿大的技术移民，投资移民，甚至灰色一点的，难民，偷渡客，所以补充了一些故事。但这样一来字母就不够用了，我就用他们的外号或者...&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2020/07/06/217394.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/217394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2020-07-06 09:49 <a href="http://www.cppblog.com/Chipset/archive/2020/07/06/217394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>零基础学编程 --- 转贴</title><link>http://www.cppblog.com/Chipset/archive/2019/12/19/217042.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Thu, 19 Dec 2019 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2019/12/19/217042.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/217042.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2019/12/19/217042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/217042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/217042.html</trackback:ping><description><![CDATA[<div><strong>转自：https://www.zhihu.com/question/39431192</strong></div><p align="left"><span style="font-family: 宋体;">对于所有编程学习者，尤其是零基础的同学们，在学习的初期，一定要给自己做一个思想上的转变。在我的编程学习理论中，这个思想的转变至关重要，什么时候你把这个思维转换过来了，你就是真正上道的那一天。</span></p>  <p align="left"><span style="font-family: 宋体;">这个思维转换就是：<strong>不要把自己当学生，而是要把自己当开发者。</strong></span></p>  <p align="left"><span style="font-family: 宋体;">不同的身份认同感，最后会导致不同的行为模式，而这行为模式，会对你的编程学习造成非常大的影响。</span></p>  <p align="left"><strong><span style="font-family: 宋体;">区别一：记笔记</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;"> VS </span></strong><strong><span style="font-family: 宋体;">写技术文章</span></strong><strong></strong></p>  <p align="left"><span style="font-family: 宋体;">学生有一个特点，就是他们喜欢记笔记，但是开发者不怎么记笔记，而是会把自己学会的东西写成技术文章、教程的形式发表在技术博客或者知乎等网站上。</span></p>  <p align="left"><span style="font-family: 宋体;">一个很有名的学习法叫做<strong>费曼学习法</strong>，这个学习方法简单地说，就是在学完一个东西之后，去给别人讲明白，注意，是讲给别人听，当你写成文章发表在网上的时候，你自然会去用更通俗的语言，更清晰的逻辑去讲述这个事物背后的逻辑，这个过程，是对自己学习的一个检验，也是加深映像，整理思路的重要过程。</span></p>  <p align="left"><span style="font-family: 宋体;">那么如果你是去记笔记的话，很有可能，你不会去试图讲清楚这个东西，而是倾向于去照抄，或是不完全照抄，以</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">提纲</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">或是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">知识点</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">的形式抄在本子上，说句实话，照抄的笔记，真的没用，因为现在搜索引擎的能力已经可以让你把大多数东西快速找到，你为什么还要照抄到笔记本上呢？</span></p>  <p align="left"><span style="font-family: 宋体;">从功利的角度考虑，技术文章的写作，别人可以直接访问，也可以逐渐累积你的影响力，一个好的个人技术博客，会给你的简历加分很多，而一个厚厚的笔记本，没有人会管你记了什么。</span></p>  <p align="left"><strong><span style="font-family: 宋体;">区别二：以学会</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span></strong><strong><span style="font-family: 宋体;">为目标</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;"> VS </span></strong><strong><span style="font-family: 宋体;">以做出</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span></strong><strong><span style="font-family: 宋体;">为目标</span></strong><strong></strong></p>  <p align="left"><span style="font-family: 宋体;">你会发现，学生思维里面有一个重要的特点，就是他们总是特别关注自己</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">学会了什么</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">，不仅如此，他给自己定的目标，定的计划，永远都是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">学会</span><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span><span style="font-family: 宋体;">书第</span><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span><span style="font-family: 宋体;">章内容</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">。</span></p>  <p align="left"><strong><span style="font-family: 宋体;">学生永远在准备</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span></strong><strong><span style="font-family: 宋体;">而开发者早已动手。</span></strong></p>  <p align="left"><span style="font-family: 宋体;">如果你还在上学，学生思维是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">这个学期我要学会</span><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span><span style="font-family: 宋体;">课程</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">，而开发者思维是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">这个学期我要做出</span><span style="font-family: &quot;Times New Roman&quot;, serif;">XX&#8221;</span><span style="font-family: 宋体;">。</span></p>  <p align="left"><span style="font-family: 宋体;">如果学</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">，学生思维会拿起一本教材，开始从头到尾看，我不知道你们发现没有，几乎所有那种编程语言教材，长得都差不多，上来先是基本的语法，基本的整型变量，浮点型变量之类的，然后伴随着几个小的教学例子。</span></p>  <p align="left"><span style="font-family: 宋体;">开发者学</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">，他第一步绝对不是去书店买教材，而是先去了解，</span><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span></strong><span style="font-family: 宋体;">适合做什么，然后他了解到，</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">适合做<strong>爬虫，数据分析，</strong></span><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">AI</span></strong><strong><span style="font-family: 宋体;">，还能很轻松地搭建</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">Web</span></strong><strong><span style="font-family: 宋体;">后端，</span></strong><span style="font-family: 宋体;">之后他逛了一下午</span><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">Github</span></strong><span style="font-family: 宋体;">，看了看那些</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">高星项目都是做啥的，于是他给自己定下了这个目标：半年时间内，我要用</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">和</span><span style="font-family: &quot;Times New Roman&quot;, serif;">Python</span><span style="font-family: 宋体;">周边的库搭建出一个网站，这个网站服务端运用爬虫技术爬取一些数据，可以提供知乎粉丝性别比例分析功能。</span></p>  <p align="left"><span style="font-family: 宋体;">学生继续看书，一个个的知识点去记忆，拿着他的小本本去总结知识点，而开发者<strong>上官网简单的看了下</strong></span><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">Reference Doc</span></strong><strong><span style="font-family: 宋体;">的简单交互式语法教程</span></strong><span style="font-family: 宋体;">后，便马上开始了<strong>边做边学</strong>的过程，有了一个<strong>实际的项目目标</strong>，朝着这个目标走，不断地发现自己不会这，不会那，然后有目的性的去补足知识，他了解到了</span><span style="font-family: &quot;Times New Roman&quot;, serif;">beautiful soup</span><span style="font-family: 宋体;">作为爬虫主库，</span><span style="font-family: &quot;Times New Roman&quot;, serif;">flask</span><span style="font-family: 宋体;">作为后端</span><span style="font-family: &quot;Times New Roman&quot;, serif;">web</span><span style="font-family: 宋体;">服务主库，然后会去看一些简单的教程，在这个过程中，基础语法得到了熟练，也训练了工程能力。</span></p>  <p align="left"><strong><span style="font-family: 宋体;">学生的成就感来源于学会了什么，开发者的成就感来源于做出来什么。</span></strong></p>  <p align="left"><span style="font-family: 宋体;">开发者很功利，他们深知他们学会的所有东西都是为了开发出伟大的产品而服务的，所以他们绝对不会出现</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">在学一个东西，但是也不知道学这个用来干嘛</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">的窘境。</span></p>  <p align="left"><strong><span style="font-family: 宋体;">区别三：厌恶不确定性</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;"> VS </span></strong><strong><span style="font-family: 宋体;">接受不确定性</span></strong><strong></strong></p>  <p align="left"><span style="font-family: 宋体;">学生们总是对</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">确定性</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">有一种几乎疯狂的追求，他们总问，</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;C</span><span style="font-family: 宋体;">语言学到什么程度就一定能被大厂录取？</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">，</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">掌握</span><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span><span style="font-family: 宋体;">要几个月？</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">，</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">上课认真听讲，认真做笔记，考试是否一定能上</span><span style="font-family: &quot;Times New Roman&quot;, serif;">80</span><span style="font-family: 宋体;">分？</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span></p>  <p align="left"><span style="font-family: 宋体;">这种对确定性的追求，直接导致学生有一种下意识的举动：</span></p>  <p align="left"><strong><span style="font-family: 宋体;">干什么都等准备好了再去做，但是却</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span></strong><strong><span style="font-family: 宋体;">永远在准备</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span></strong><strong><span style="font-family: 宋体;">。</span></strong></p>  <p align="left"><span style="font-family: 宋体;">因为他们害怕那种不太会还要硬上带来的各种不确定性，他们渴求一种内功的修炼，寄希望于</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">把基础夯实了，就能顺畅的开发，所以还是先夯实基础吧！</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span></p>  <p align="left"><span style="font-family: 宋体;">开发者选择接受这种不确定性，他们愿意</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">边学变做</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">，因为他们知道，最初学习敲键盘的时候，他们就是这么做的，边看某个按键在哪，边打字，做和学交叉进行，他们始终<strong>抱有疑问</strong>，他们又始终试图通过学习的延伸拓展去<strong>解决疑问</strong>，他们仿佛就像是拿着烛火在迷宫中行走的侠客，在游戏的一开始，对迷宫的结构一无所知，通过不断地摸索和碰壁，逐渐建立起对整个地图的认知</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><strong><span style="font-family: 宋体;">区别四</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">: </span></strong><strong><span style="font-family: 宋体;">线性学习</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;"> VS </span></strong><strong><span style="font-family: 宋体;">递归学习</span></strong><strong></strong></p>  <p align="left"><span style="font-family: 宋体;">学生喜欢<strong>线性的学习</strong>，因为线性的学习（拿本教材从头到尾慢慢看）正是符合了他们对<strong>确定性</strong>的追求，可惜这违背了学习的本来面目</span></p>  <p align="left"><span style="font-family: 宋体;">开发者知道，人脑最不擅长的就是<strong>线性枚举</strong>，即便我们认识几千个汉字，但是我们无法去<strong>线性地去将所有认识的汉字枚举出来</strong>，我们的大脑，本就不是用来进行线性思考的，而复杂度上了一定程度的知识，线性的掌握，基本不可能。</span></p>  <p align="left"><span style="font-family: 宋体;">有难度的知识，往往是这样的：为了搞懂</span><span style="font-family: &quot;Times New Roman&quot;, serif;">A</span><span style="font-family: 宋体;">，而去学</span><span style="font-family: &quot;Times New Roman&quot;, serif;">B</span><span style="font-family: 宋体;">，为了学会</span><span style="font-family: &quot;Times New Roman&quot;, serif;">B</span><span style="font-family: 宋体;">，而去学</span><span style="font-family: &quot;Times New Roman&quot;, serif;">C</span><span style="font-family: 宋体;">，这叫<strong>递归学习</strong>，递归虽深，但有回溯，它最终会回溯到我们的起点。</span></p>  <p align="left"><span style="font-family: 宋体;">所以开发者的学习更偏向于<strong>递归式的学习</strong>，而且可能会以一个知识点为起点，去完成树状知识外围的<strong>遍历。</strong>（有点像搜索引擎去爬虫）</span></p>  <p align="left"><strong><span style="font-family: 宋体;">知识是树状结构</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span></strong><strong><span style="font-family: 宋体;">或者网状结构</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></strong></p>  <p align="left"><span style="font-family: 宋体;">当我们试图遍历一个树的时候</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">最简单直接的方式就是<strong>递归</strong></span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">如果你非要去</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">线性</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">的学</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">那就你是把编程学习当成了链表</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">还是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8220;</span><span style="font-family: 宋体;">单向</span><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span><span style="font-family: 宋体;">的，这种算法怎么可能用来遍历树呢？</span></p>  <p align="left"><strong><span style="font-family: 宋体;">区别五：拿会</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span></strong><strong><span style="font-family: 宋体;">定义自己</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;"> VS </span></strong><strong><span style="font-family: 宋体;">拿</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span></strong><strong><span style="font-family: 宋体;">项目作者定义自己</span></strong><strong></strong></p>  <p align="left"><span style="font-family: &quot;Times New Roman&quot;, serif;">linus </span><span style="font-family: 宋体;">从来不说自己精通</span><span style="font-family: &quot;Times New Roman&quot;, serif;"> c </span><span style="font-family: 宋体;">语言</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">与其说他不需要</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">不如说他不关心</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">因为他是</span><span style="font-family: &quot;Times New Roman&quot;, serif;"> linux </span><span style="font-family: 宋体;">和</span><span style="font-family: &quot;Times New Roman&quot;, serif;"> git </span><span style="font-family: 宋体;">的作者</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: &quot;Times New Roman&quot;, serif;">linus </span><span style="font-family: 宋体;">这个程序员之神就是一个典型的<strong>开发者</strong>思维的人</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">我希望所有计算机专业的同学们</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">等你们毕业了之后</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">你的</span><span style="font-family: &quot;Times New Roman&quot;, serif;">github</span><span style="font-family: 宋体;">应该是绿油油的</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">而不是贫瘠的一片白</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">我希望你们用你们的简历里写的是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><strong><span style="font-family: 宋体;">用</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">c</span></strong><strong><span style="font-family: 宋体;">语言实现了一个</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">XX</span></strong><strong><span style="font-family: 宋体;">引擎</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">, github</span></strong><strong><span style="font-family: 宋体;">链接</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">&#8221;</span></strong><strong><span style="font-family:&quot;Times New Roman&quot;,serif;">http://github.com/xxxxxx&#8221;</span></strong><span style="font-family: 宋体;">而不是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><strong><span style="font-family: 宋体;">精通</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">c</span></strong><span style="font-family: &quot;Times New Roman&quot;, serif;">".</span></p>  <p align="left"><span style="font-family: 宋体;">我希望学生们明白</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">任何一个像样子的项目</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">制作周期至少是按月计</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">你的大学有四年时间</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">哪怕一个项目做一年</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">你也能拿出两三个好项目</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">不一定有多少</span><span style="font-family: &quot;Times New Roman&quot;, serif;">star, </span><span style="font-family: 宋体;">但是要完整</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">文档</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">测试</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">一应俱全</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">我希望学生们知道</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">做项目和写课后习题不一样</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">课后习题一个小时</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">而项目是长期不断努力</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">不断学习突破的过程</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">需要你每天都搞</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">善始善终</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">最终拿出成果来</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">我希望学生们明白</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">这个世界衡量一个人的成就</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">从来都是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">他做了什么</span><span style="font-family: &quot;Times New Roman&quot;, serif;">", </span><span style="font-family: 宋体;">而不是</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">他学会了什么</span><span style="font-family: &quot;Times New Roman&quot;, serif;">", </span><span style="font-family: 宋体;">不要总用修炼内功去感动自己</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">必要时</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">也请你为开源世界贡献一点自己的力量</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">我希望学生们明白</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">考上</span><span style="font-family: &quot;Times New Roman&quot;, serif;">985, </span><span style="font-family: 宋体;">拿奖学金</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">这都不叫成就</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">因为<strong>和别人没关系</strong></span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">只有真正影响到别人的东西</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">让这个世界变得更好的东西</span><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span><span style="font-family: 宋体;">才是值得去</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">秀</span><span style="font-family: &quot;Times New Roman&quot;, serif;">"</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Times New Roman&quot;, serif;">.</span></p>  <p align="left"><span style="font-family: 宋体;">最后送给学生们一句话</span><span style="font-family: &quot;Times New Roman&quot;, serif;">: </span><strong><span style="font-family: 宋体;">愿你早日忘记学生的身份</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span></strong><strong><span style="font-family: 宋体;">以开发者的姿态</span></strong><strong><span style="font-family: &quot;Times New Roman&quot;, serif;">, </span></strong><strong><span style="font-family: 宋体;">面对这个世界。</span></strong></p><img src ="http://www.cppblog.com/Chipset/aggbug/217042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2019-12-19 17:22 <a href="http://www.cppblog.com/Chipset/archive/2019/12/19/217042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How Far I'll Go</title><link>http://www.cppblog.com/Chipset/archive/2018/08/27/215882.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Mon, 27 Aug 2018 13:14:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2018/08/27/215882.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/215882.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2018/08/27/215882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/215882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/215882.html</trackback:ping><description><![CDATA[<div><strong><span style="font-size: 12pt;">How far I'll go --</span><font face="Arial"><span style="background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: #f5f5f5; font-size: 12pt;">&nbsp;Alessia Cara</span></font></strong><span style="color: #333333; font-family: arial; font-size: 12px; background-color: #f5f5f5;">&nbsp;<br /><br /></span></div><div></div><div><span style="font-size: 12pt;">I've been standing at the edge of the water</span><br /><span style="font-size: 12pt;">Long as I can remember, never really knowing why</span><br /><span style="font-size: 12pt;">I wish I could be the perfect daughter</span><br /><span style="font-size: 12pt;">But I come back to the water, no matter how hard I try</span><br /><br /><span style="font-size: 12pt;">Every turn I take, every trail I track, every path I make, every road leads back</span><br /><span style="font-size: 12pt;">To the place I know, where I cannot go</span><br /><span style="font-size: 12pt;">Though I long to be</span><br /><br /><span style="font-size: 12pt;">See the line where the sky meets the sea? It calls me</span><br /><span style="font-size: 12pt;">And no one knows, how far it goes</span><br /><span style="font-size: 12pt;">If the wind in my sail on the sea stays behind me</span><br /><span style="font-size: 12pt;">One day I'll know, if I go there's just no telling how far I'll go</span><br /><br /><span style="font-size: 12pt;">Go-oh-oh-oh-oh-oh-oh-oh-oh-oh</span><br /><span style="font-size: 12pt;">Go-oh-oh-oh-oh-oh-oh-oh-oh-oh</span><br /><span style="font-size: 12pt;">Go-oh-oh-oh-oh-oh-oh-oh-oh-oh</span><br /><span style="font-size: 12pt;">Go-oh-oh-oh-oh-oh-oh-oh-oh-oh</span><br /><br /><span style="font-size: 12pt;">I know everybody on this island seems so happy on this island</span><br /><span style="font-size: 12pt;">Everything is by design</span><br /><span style="font-size: 12pt;">I know everybody on this island has a role on this island</span><br /><span style="font-size: 12pt;">So maybe I can roll with mine</span><br /><br /><span style="font-size: 12pt;">I can lead with pride, I can make us strong</span><br /><span style="font-size: 12pt;">I'll be satisfied if I play along</span><br /><span style="font-size: 12pt;">But the voice inside sings a different song</span><br /><span style="font-size: 12pt;">What is wrong with me?</span><br /><br /><span style="font-size: 12pt;">See the light as it shines on the sea? It's blinding</span><br /><span style="font-size: 12pt;">But no one knows, how deep it goes</span><br /><span style="font-size: 12pt;">And it seems like it's calling out to me, so come find me</span><br /><span style="font-size: 12pt;">And let me know, what's beyond that line, will I cross that line?</span><br /><br /><span style="font-size: 12pt;">See the line where the sky meets the sea? It calls me</span><br /><span style="font-size: 12pt;">And no one knows, how far it goes</span><br /><span style="font-size: 12pt;">If the wind in my sail on the sea stays behind me</span><br /><span style="font-size: 12pt;">One day I'll know, how far I'll go<br /><br /></span><div><strong><span style="font-size: 12pt;">How far I'll go --</span><font face="Arial"><span style="background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: #f5f5f5; font-size: 12pt; color: red;">&nbsp;</span></font><span>Auli'i Cravalho</span></strong><font face="Arial"><span style="background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: #f5f5f5; font-size: 12pt; color: red;"><br /></span></font><span style="color: #333333; font-family: arial; font-size: 12px; background-color: #f5f5f5;"><br /></span></div><div></div><div><span style="font-size: 12pt;">I've been staring at the edge of the water</span><br /><span style="font-size: 12pt;">Long as I can remember, never really knowing why</span><br /><span style="font-size: 12pt;">I wish I could be the perfect daughter</span><br /><span style="font-size: 12pt;">But I come back to the water, no matter how hard I try</span><br /><br /><span style="font-size: 12pt;">Every turn I take, every trail I track, every path I make, every road leads back</span><br /><span style="font-size: 12pt;">To the place I know, where I cannot go</span><br /><span style="font-size: 12pt;">Where I long to be</span><br /><br /><span style="font-size: 12pt;">See the line where the sky meets the sea? It calls me</span><br /><span style="font-size: 12pt;">And no one knows, how far it goes</span><br /><span style="font-size: 12pt;">If the wind in my sail on the sea stays behind me</span><br /><span style="font-size: 12pt;">One day I'll know, if I go there's just no telling how far I'll go</span><br /><br /><span style="font-size: 12pt;">I know everybody on this island seems so happy on this island</span><br /><span style="font-size: 12pt;">Everything is by design</span><br /><span style="font-size: 12pt;">I know everybody on this island has a role on this island</span><br /><span style="font-size: 12pt;">So maybe I can roll with mine</span><br /><br /><span style="font-size: 12pt;">I can lead with pride, I can make us strong</span><br /><span style="font-size: 12pt;">I'll be satisfied if I play along</span><br /><span style="font-size: 12pt;">But the voice inside sings a different song</span><br /><span style="font-size: 12pt;">What is wrong with me?</span><br /><br /><span style="font-size: 12pt;">See the light as it shines on the sea? It's blinding</span><br /><span style="font-size: 12pt;">But no one knows, how deep it goes</span><br /><span style="font-size: 12pt;">And it seems like it's calling out to me, so come find me</span><br /><span style="font-size: 12pt;">And let me know, what's beyond that line, will I cross that line?</span><br /><br /><span style="font-size: 12pt;">See the line where the sky meets the sea? It calls me</span><br /><span style="font-size: 12pt;">And no one knows, how far it goes</span><br /><span style="font-size: 12pt;">If the wind in my sail on the sea stays behind me</span><br /><span style="font-size: 12pt;">One day I'll know, how far I'll go</span></div></div><img src ="http://www.cppblog.com/Chipset/aggbug/215882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2018-08-27 21:14 <a href="http://www.cppblog.com/Chipset/archive/2018/08/27/215882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>When someone gives you a bug [FWD]</title><link>http://www.cppblog.com/Chipset/archive/2015/04/01/210219.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Wed, 01 Apr 2015 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2015/04/01/210219.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/210219.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2015/04/01/210219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/210219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/210219.html</trackback:ping><description><![CDATA[(I'm a front-end developer, but I thought this might resonate)<br /><br />Someone gives you a bug. "The light in the conference room on the 26th floor is on. It needs to be off."<br /><br />A note on the bug says, &#8220;This will take you like 5 minutes. It's just flipping a switch."<br /><br />You go to the conference room on 26. The light is on, but there's no light switch in the room.<br /><br />So you prepare to install one. But the designer says it would ruin the room&#8217;s aesthetic. Plus, the walls are concrete. With the proper tools, you could install the switch. But no one will approve the purchase of the proper tools. Without the proper tools it will take two days. And they want it done now, because they're afraid that any minute the CEO might decide to go to the 26th floor and happen to walk by the conference room and ask why the hell that light is on.<br /><br />And now you're getting emails asking why the light isn't off yet.<br /><br />So now you have to stop and send a group email to explain the situation, and several people start up a panicked email chain.<br /><br />You know if you wait for the problem to be resolved by anyone discussing it in the email chain, it won&#8217;t get fixed. The bug has your name on it, and it's dated today, so you're the one in trouble if it isn't resolved. So you go up into the hallway ceiling on 26, find the wires leading to the light, cut and cap them. Finally. Problem solved.<br /><br />In order to quell the panic in the email thread, you report back how you solved the issue.<br /><br />You don&#8217;t hear anything for a while. When you do, everyone is concerned that now the light can&#8217;t be turned on and off. What if the CEO wants to have a meeting in there? So here&#8217;s what they ask you to do: They want you to run wires from the light down into the basement. When someone needs the light to be on or off, they&#8217;ll contact you, and have you run to the basement and either connect or disconnect the wires.<br /><br />You protest the ridiculousness of this solution. Your boss says, &#8220;Yeah, I know it&#8217;s not ideal. But it&#8217;s the only solution we have right now."<br /><br />At this point you realize you have a choice. You could do this. Or you could quit in protest, and find another job. But you realize that once you start that new job, they&#8217;re likely to ask you to do something just as idiotic, if not more so.<br /><br />So you go run the wires from floor 26 down to the basement. When you get to the basement, you see dozens of wires hanging out of the walls, from all the people who have had to do this exact same thing before. (So that&#8217;s where the idea came from.) You set up the wires and label them as best you can, with a short apology to whoever has to deal with this next.<br /><br />When you get back to your desk, you have a message. QA has reopened the bug. It says, &#8220;I see light."<br /><br />You head back up to the conference room on 26. The light is off. You go back to your desk and close the bug, reporting that you checked on it in person.<br /><br />QA reopens the bug again. &#8220;Room still lit&#8221; it says. After looking at the unlit bulb one more time, you tell your boss, who suggests you go back down to the basement and check the wires. You protest that you are looking at the light right now and it&#8217;s off. &#8220;I know, but this way you can tell QA you checked out absolutely everything."<br /><br />So you sigh and head to the basement. Sure enough, the wires are not connected. The ends are capped. They are not resting on anything that could conduct electricity.<br /><br />You report back to QA that you checked the wires, which are not connected, and that you looked at the bulb, which was unlit.<br /><br />&#8220;I didn&#8217;t mean the bulb,&#8221; says QA. &#8220;The bug is about light in the room. There&#8217;s still too much light. Shouldn&#8217;t you close the blinds?"<br /><br />You respond that the blinds don&#8217;t fall under your control, and that the bug specifies the light being turned off.<br /><br />Not believing you, QA sends out a group email asking if the blinds are covered by the bug.<br /><br />Some time passes before you hear from anyone. Finally someone from the email chain calls you.<br /><br />&#8220;Theoretically,&#8221; they ask, &#8220;could someone participating in a meeting in the conference room on 26 open or close the blinds by themselves if it was too bright or too dark?"<br /><br />Yes they could, you reply.<br /><br />&#8220;Like, an ordinary person? They wouldn&#8217;t need you to do it?"<br /><br />Yes, an ordinary person. No, they wouldn&#8217;t need you. Anyone can do it.<br /><br />&#8220;Great. Excellent. Then we&#8217;ll leave that for now. I&#8217;ll schedule a stand-up meeting about the blinds issue."<br /><br />So the bug is closed. Now, the CEO, possibly having caught wind of all the discussion and furtive activity surrounding the conference room on 26, wants to have a meeting there. You get several panicked emails that they need the light on.<br /><br />You go to the basement, connect the wires, and return to your desk, to find 32 new messages in your inbox. &#8220;Something&#8217;s wrong&#8212;the light&#8217;s not on!&#8221; &#8220;There&#8217;s a problem &#8212; no light!&#8221; &#8220;Are you getting these emails?&#8221; and so on.<br /><br />The 32nd email says, &#8220;Nevermind&#8212;the light&#8217;s on."<br /><br />This process is repeated more or less exactly when it&#8217;s time to turn the light off again.<br /><br />But if there&#8217;s any good news, it&#8217;s this: after the meeting, everyone forgets that there even is a conference room on 26, so you never have to do anything about it again.<br /><br />Wow, gold! Thanks!<img src ="http://www.cppblog.com/Chipset/aggbug/210219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2015-04-01 14:39 <a href="http://www.cppblog.com/Chipset/archive/2015/04/01/210219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>using gcc_x86 assembly to scan the most significant one bit and the least significant one bit</title><link>http://www.cppblog.com/Chipset/archive/2014/06/15/207298.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Sun, 15 Jun 2014 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2014/06/15/207298.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/207298.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2014/06/15/207298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/207298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/207298.html</trackback:ping><description><![CDATA[原来发过搜索第一位的帖子，这次算再补充一下吧。以下取自网络，作者不详。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#ifdef&nbsp;__GNUC__<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;(defined&nbsp;_WIN64&nbsp;||&nbsp;defined&nbsp;__x86_64__)</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;../bit_scan_forward<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@return&nbsp;index&nbsp;(0..63)&nbsp;of&nbsp;least&nbsp;significant&nbsp;one&nbsp;bit<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">unsigned&nbsp;bit_scan_forward(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bsfq&nbsp;%0,&nbsp;%0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">=r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x)&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x));<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;unsigned(x);<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;bit_scan_reverse<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@return&nbsp;index&nbsp;(0..63)&nbsp;of&nbsp;most&nbsp;significant&nbsp;one&nbsp;bit<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">unsigned&nbsp;bit_scan_reverse(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bsrq&nbsp;%0,&nbsp;%0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">=r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x)&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x));<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;unsigned(x);<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#elif</span><span style="color: #000000; ">&nbsp;(defined&nbsp;_WIN32)&nbsp;||&nbsp;(defined&nbsp;__linux__)</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;../bit_scan_forward<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@return&nbsp;index&nbsp;(0..63)&nbsp;of&nbsp;least&nbsp;significant&nbsp;one&nbsp;bit<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">unsigned&nbsp;bit_scan_forward(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bsf&nbsp;%0,&nbsp;%0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">=r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x)&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x));<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;unsigned(x);<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;bit_scan_reverse<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;@return&nbsp;index&nbsp;(0..63)&nbsp;of&nbsp;most&nbsp;significant&nbsp;one&nbsp;bit<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">unsigned&nbsp;bit_scan_reverse(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bsr&nbsp;%0,&nbsp;%0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">=r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x)&nbsp;:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;(x));<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;unsigned(x);<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/207298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2014-06-15 17:38 <a href="http://www.cppblog.com/Chipset/archive/2014/06/15/207298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bogo_sort (名副其实最慢的的排序)</title><link>http://www.cppblog.com/Chipset/archive/2012/01/10/163932.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 10 Jan 2012 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2012/01/10/163932.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/163932.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2012/01/10/163932.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/163932.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/163932.html</trackback:ping><description><![CDATA[一直追求的目标是写出高效低内存消耗的程序，时间久了觉得换个方向了，呵呵。就拿排序试试吧。<br />bogo sort又称stupid sort或slow sort，我觉得应该是最慢的排序算法了吧，至少理论上比蜗牛排序(本主页有介绍)慢。<br />该排序算法的思想是对于一个给定的序列，随机的生成各种可能的序列，直到遇到某个序列有序为止。时间复杂度最好情况下是O(n)，最坏情况下是无穷大，一般情况是O(n*n!)，可见相当的恐怖。看代码就明白了。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;bogo_sort.hpp</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">#ifndef&nbsp;BOGO_SORT_HPP_<br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BOGO_SORT_HPP_</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;is_sorted(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ForwardIterator&nbsp;next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">next;&nbsp;next&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;next,&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">next)<br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">next,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first))<br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;swap(T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;x,&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;y)<br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T&nbsp;tmp(x);<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;y;<br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;RandomGen</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;shuffle(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;RandomGen&nbsp;gen)<br /></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(d&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomIterator&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;&nbsp;first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first)<br /></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(it&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;gen()</span><span style="color: #000000; ">%</span><span style="color: #000000; ">d),&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first);<br /></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">random.hpp</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;bogo_sort(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">is_sorted(first,&nbsp;last,&nbsp;cmp))<br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;shuffle(first,&nbsp;last,&nbsp;random());<br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;random.hpp</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">#ifndef&nbsp;RANDOM_HPP_<br /></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;RANDOM_HPP_</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ctime</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;random<br /></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;typedef&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;UInt32;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;如果你的编译器不认识uint32_t，就用unsigned&nbsp;long代替</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;a;<br /></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;b;<br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;c;<br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;d;<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;randomize()<br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;UInt32&nbsp;e&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;((b&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(b&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;b&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;((c&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">17</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;(c&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;d;<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;d&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;e;<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;e&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;a;<br /></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;d;<br /></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;init()<br /></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(UInt32&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomize();<br /></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">explicit</span><span style="color: #000000; ">&nbsp;random(UInt32&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;std::time(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">))&nbsp;:&nbsp;a(</span><span style="color: #000000; ">4058668781ul</span><span style="color: #000000; ">),&nbsp;b(s),&nbsp;c(s),&nbsp;d(s)<br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;init();<br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;reset(UInt32&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;s)<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;std::time(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4058668781ul</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;d&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s;<br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;init();<br /></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;rand()<br /></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">returns&nbsp;a&nbsp;random&nbsp;integer&nbsp;in&nbsp;the&nbsp;range&nbsp;[0,&nbsp;4294967296)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;randomize();<br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;real()<br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">returns&nbsp;a&nbsp;random&nbsp;real&nbsp;number&nbsp;in&nbsp;the&nbsp;range&nbsp;[0.0,&nbsp;1.0)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;randomize()&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4294967296.0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;UInt32&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()()&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;rand();&nbsp;}<br /></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;RANDOM_HPP_</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;main.cpp</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bogo_sort.hpp</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;greater<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">&nbsp;()(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;x,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;y)&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;x;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;LEN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;arr[LEN]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;};<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">is_sorted(arr,&nbsp;arr&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;LEN,&nbsp;greater</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">())) // 就来个从大到小的顺序吧<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;shuffle(arr,&nbsp;arr&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;LEN,&nbsp;random());<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;LEN;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 序列这么短，输出看看就行<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;arr[i]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; "></span></div><img src ="http://www.cppblog.com/Chipset/aggbug/163932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2012-01-10 13:10 <a href="http://www.cppblog.com/Chipset/archive/2012/01/10/163932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用排序数组代替平衡树实现关联容器</title><link>http://www.cppblog.com/Chipset/archive/2011/09/27/156996.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 27 Sep 2011 11:55:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/09/27/156996.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/156996.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/09/27/156996.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/156996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/156996.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: STL中的关联容器一般用平衡树来实现，多数是红黑树，平衡树的单个插入、查找、删除操作时间复杂度都为O(logn)，但是为了保证元素之间的相对次 序，每个元素需要三个指针和一个状态位的内存开销，还有，在堆上分配的每块内存都有几个字节的metadata开销。如果用于处理短类型的元素，这实在不划算。况且很多场合我们并不需要频繁插入和删除元素，仅仅是大量检 索操作。 如果仅需要大量查找，且不会频繁的插入和...&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2011/09/27/156996.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/156996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-09-27 19:55 <a href="http://www.cppblog.com/Chipset/archive/2011/09/27/156996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查找一个64位整数二进制第一个1</title><link>http://www.cppblog.com/Chipset/archive/2011/08/23/154114.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 23 Aug 2011 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/23/154114.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/154114.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/23/154114.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/154114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/154114.html</trackback:ping><description><![CDATA[<div> 		<div>  <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">有时候用到位运算。需要快速找到一个整数的二进制第一个</span>1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">或</span>0<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">在哪个位</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">下标</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">？例如：十进制数</span>100<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的二进制是</span>1100100<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，那么它的第一个</span>1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">在下标</span> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">为</span>2<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的位置</span>(bsf, bit scan forward)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">或</span>6<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的位置</span>(bsr, bit scan in reverse order)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，由于只用于存储一个状态，至于用</span>bsf<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">还是</span>bsr<span style="font-family: SimSun;">则无所谓。</span><br /> <br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">解决这个问题的第一个想法就是用内联汇编的做法，使用特别的</span>CPU<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">指令去找，但汇编的可移植性比较差，不同的</span>CPU<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">型号使用的指令可能不一样，执行速度也不一样。</span><br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">假设找一个</span>64<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">位无符号整数二进制的第一个</span>1<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">，用</span>bsf, AT&amp; T<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">汇编</span>(gcc<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">汇编</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">可以这样做：</span></p>  <p style="background:#EEEEEE;word-break:break-all"><span style="font-size:10.0pt;color:teal">&nbsp;1</span><span style="font-size:10.0pt">&nbsp;<span style="color:green">//&nbsp;bit&nbsp;scan&nbsp;forward&nbsp;for&nbsp;64&nbsp;bit&nbsp;integral&nbsp;number<br /> </span><span style="color:teal">&nbsp;2</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;3</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsf_asm&nbsp;(uint64_t&nbsp;w)<br /> </span><span style="color:teal">&nbsp;4</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">&nbsp;5</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;x1,&nbsp;x2;<br /> </span><span style="color:teal">&nbsp;6</span>&nbsp;<span style="color:black">&nbsp;&nbsp;asm&nbsp;("bsf&nbsp;%0,%0\n"&nbsp;"jnz&nbsp;1f\n"&nbsp;"bsf&nbsp;%1,%0\n"&nbsp;"jz&nbsp;1f\n"&nbsp;"addl&nbsp;$32,%0\n"<br /> </span><span style="color:teal">&nbsp;7</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1:":&nbsp;"=&amp;q"&nbsp;(x1),&nbsp;"=&amp;q"&nbsp;(x2):"1"&nbsp;((</span><span style="color:blue">int</span><span style="color:black">)&nbsp;(w&nbsp;&gt;&gt;&nbsp;32)),<br /> </span><span style="color:teal">&nbsp;8</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"0"&nbsp;((</span><span style="color:blue">int</span><span style="color:black">)&nbsp;w));<br /> </span><span style="color:teal">&nbsp;9</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;x1;<br /> </span><span style="color:teal">10</span>&nbsp;<span style="color:black">}</span></span></p>  <p><br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">如果用</span>C<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">来实现的话，那就有点麻烦了，在此不讲复杂的数学原理，仅仅给出代码。</span></p>  <p style="background:#EEEEEE"><span style="font-size:10.0pt; color:teal">&nbsp;1</span><span style="font-size:10.0pt">&nbsp;<span style="color:green">//&nbsp;bit&nbsp;scan&nbsp;forward&nbsp;for&nbsp;64&nbsp;bit&nbsp;integral&nbsp;number<br /> </span><span style="color:teal">&nbsp;2</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;3</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsf_folded&nbsp;(uint64_t&nbsp;bb)<br /> </span><span style="color:teal">&nbsp;4</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">&nbsp;5</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:blue">static</span>&nbsp;<span style="color:blue">const</span>&nbsp;<span style="color:blue">int</span><span style="color:black">&nbsp;lsb_64_table[64]&nbsp;=<br /> </span><span style="color:teal">&nbsp;6</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">&nbsp;7</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63,&nbsp;30,&nbsp;&nbsp;3,&nbsp;32,&nbsp;59,&nbsp;14,&nbsp;11,&nbsp;33,<br /> </span><span style="color:teal">&nbsp;8</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60,&nbsp;24,&nbsp;50,&nbsp;&nbsp;9,&nbsp;55,&nbsp;19,&nbsp;21,&nbsp;34,<br /> </span><span style="color:teal">&nbsp;9</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;61,&nbsp;29,&nbsp;&nbsp;2,&nbsp;53,&nbsp;51,&nbsp;23,&nbsp;41,&nbsp;18,<br /> </span><span style="color:teal">10</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;56,&nbsp;28,&nbsp;&nbsp;1,&nbsp;43,&nbsp;46,&nbsp;27,&nbsp;&nbsp;0,&nbsp;35,<br /> </span><span style="color:teal">11</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;62,&nbsp;31,&nbsp;58,&nbsp;&nbsp;4,&nbsp;&nbsp;5,&nbsp;49,&nbsp;54,&nbsp;&nbsp;6,<br /> </span><span style="color:teal">12</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15,&nbsp;52,&nbsp;12,&nbsp;40,&nbsp;&nbsp;7,&nbsp;42,&nbsp;45,&nbsp;16,<br /> </span><span style="color:teal">13</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25,&nbsp;57,&nbsp;48,&nbsp;13,&nbsp;10,&nbsp;39,&nbsp;&nbsp;8,&nbsp;44,<br /> </span><span style="color:teal">14</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20,&nbsp;47,&nbsp;38,&nbsp;22,&nbsp;17,&nbsp;37,&nbsp;36,&nbsp;26<br /> </span><span style="color:teal">15</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;};<br /> </span><span style="color:teal">16</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;folded;<br /> </span><span style="color:teal">17</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;bb&nbsp;^=&nbsp;bb&nbsp;-&nbsp;1;<br /> </span><span style="color:teal">18</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;folded&nbsp;=&nbsp;(</span><span style="color:blue">int</span><span style="color:black">)&nbsp;bb&nbsp;^&nbsp;(bb&nbsp;&gt;&gt;&nbsp;32);<br /> </span><span style="color:teal">19</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;lsb_64_table[folded&nbsp;*&nbsp;0x78291ACF&nbsp;&gt;&gt;&nbsp;26];<br /> </span><span style="color:teal">20</span>&nbsp;<span style="color:black">}</span></span></p>  <p><br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">如果想从后往前搜索一个整数的二进制第一个</span>1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的下标，用汇编可以这样做。</span></p>  <p style="background:#EEEEEE;word-break:break-all"><span style="font-size:10.0pt;color:teal">&nbsp;1</span><span style="font-size:10.0pt">&nbsp;<span style="color:green">//&nbsp;bit&nbsp;scan&nbsp;in&nbsp;reverse&nbsp;order&nbsp;for&nbsp;64&nbsp;bit&nbsp;integral&nbsp;number<br /> </span><span style="color:teal">&nbsp;2</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;3</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsr_asm&nbsp;(uint64_t&nbsp;w)<br /> </span><span style="color:teal">&nbsp;4</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">&nbsp;5</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;x1,&nbsp;x2;<br /> </span><span style="color:teal">&nbsp;6</span>&nbsp;<span style="color:black">&nbsp;&nbsp;asm&nbsp;("bsr&nbsp;%1,%0\n"&nbsp;"jnz&nbsp;1f\n"&nbsp;"bsr&nbsp;%0,%0\n"&nbsp;"subl&nbsp;$32,%0\n"<br /> </span><span style="color:teal">&nbsp;7</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1:&nbsp;addl&nbsp;$32,%0\n":&nbsp;"=&amp;q"&nbsp;(x1),&nbsp;"=&amp;q"&nbsp;(x2):"1"&nbsp;((</span><span style="color:blue">int</span><span style="color:black">)&nbsp;(w&nbsp;&gt;&gt;&nbsp;32)),<br /> </span><span style="color:teal">&nbsp;8</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"0"&nbsp;((</span><span style="color:blue">int</span><span style="color:black">)&nbsp;w));<br /> </span><span style="color:teal">&nbsp;9</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;x1;<br /> </span><span style="color:teal">10</span>&nbsp;<span style="color:black">}</span></span></p>  <p><br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">如果用</span>C<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">来实现的话，也比较简单，用</span>divide and conquer <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的原理就不会太慢。</span></p>  <p style="background:#EEEEEE"><span style="font-size:10.0pt; color:teal">&nbsp;1</span><span style="font-size:10.0pt">&nbsp;<span style="color:green">//&nbsp;a&nbsp;logn&nbsp;(n&nbsp;==&nbsp;32)algorithm&nbsp;for&nbsp;bit&nbsp;scan&nbsp;in&nbsp;reverse&nbsp;order<br /> </span><span style="color:teal">&nbsp;2</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;3</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsr32(uint32_t&nbsp;bb)<br /> </span><span style="color:teal">&nbsp;4</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">&nbsp;5</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:blue">static</span>&nbsp;<span style="color:blue">const</span>&nbsp;<span style="color:blue">char</span><span style="color:black">&nbsp;msb_256_table[256]&nbsp;=<br /> </span><span style="color:teal">&nbsp;6</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">&nbsp;7</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;0,&nbsp;1,&nbsp;1,&nbsp;2,&nbsp;2,&nbsp;2,&nbsp;2,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,<br /> </span><span style="color:teal">&nbsp;8</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,&nbsp;4,&nbsp;4,&nbsp;4,&nbsp;4,&nbsp;4,&nbsp;4,&nbsp;4,4,&nbsp;4,&nbsp;4,&nbsp;4,4,&nbsp;4,&nbsp;4,&nbsp;4,<br /> </span><span style="color:teal">&nbsp;9</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,&nbsp;5,<br /> </span><span style="color:teal">10</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,<br /> </span><span style="color:teal">11</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,&nbsp;6,<br /> </span><span style="color:teal">12</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,<br /> </span><span style="color:teal">13</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,<br /> </span><span style="color:teal">14</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,<br /> </span><span style="color:teal">15</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,&nbsp;7,<br /> </span><span style="color:teal">16</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;};<br /> </span><span style="color:teal">17</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;result&nbsp;=&nbsp;0;<br /> </span><span style="color:teal">18</span>&nbsp;<span style="color:black"><br /> </span><span style="color:teal">19</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">if</span><span style="color:black">&nbsp;(bb&nbsp;&gt;&nbsp;0xFFFF)<br /> </span><span style="color:teal">20</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">21</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;&gt;&gt;=&nbsp;16;<br /> </span><span style="color:teal">22</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;16;<br /> </span><span style="color:teal">23</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;}<br /> </span><span style="color:teal">24</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">if</span><span style="color:black">&nbsp;(bb&nbsp;&gt;&nbsp;0xFF)<br /> </span><span style="color:teal">25</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">26</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;&gt;&gt;=&nbsp;8;<br /> </span><span style="color:teal">27</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;8;<br /> </span><span style="color:teal">28</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;}<br /> </span><span style="color:teal">29</span>&nbsp;<span style="color:black"><br /> </span><span style="color:teal">30</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;(result&nbsp;+&nbsp;msb_256_table[bb]);<br /> </span><span style="color:teal">31</span>&nbsp;<span style="color:black">}<br /> </span><span style="color:teal">32</span>&nbsp;<span style="color:black"><br /> </span><span style="color:teal">33</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">34</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsr_in_C(uint64_t&nbsp;bb)<br /> </span><span style="color:teal">35</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">36</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">const</span><span style="color:black">&nbsp;uint32_t&nbsp;hb&nbsp;=&nbsp;bb&nbsp;&gt;&gt;&nbsp;32;<br /> </span><span style="color:teal">37</span>&nbsp;<span style="color:black">&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;hb&nbsp;?&nbsp;32&nbsp;+&nbsp;bsr32((uint32_t)hb)&nbsp;:&nbsp;bsr32((uint32_t)bb);<br /> </span><span style="color:teal">38</span>&nbsp;<span style="color:black"><br /> </span><span style="color:teal">39</span>&nbsp;<span style="color:black">}<br /> </span><span style="color:teal">40</span>&nbsp;</span></p>  <p><br /> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">下面这个似乎也可以，失败时返回</span>-1023<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，至于速度快慢就要看编译器的嗜好了。</span></p>  <p style="background:#EEEEEE;word-break:break-all"><span style="font-size:10.0pt;color:teal">&nbsp;1</span><span style="font-size:10.0pt">&nbsp;<span style="color:green">//&nbsp;bit&nbsp;scan&nbsp;in&nbsp;reverse&nbsp;order&nbsp;for&nbsp;64&nbsp;bit&nbsp;integral&nbsp;number<br /> </span><span style="color:teal">&nbsp;2</span>&nbsp;<span style="color:green">/*&nbsp;============================================&nbsp;*/</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;3</span>&nbsp;<span style="color:black">inline&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;bsr_double&nbsp;(uint64_t&nbsp;bb)<br /> </span><span style="color:teal">&nbsp;4</span>&nbsp;<span style="color:black">{<br /> </span><span style="color:teal">&nbsp;5</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;union<br /> </span><span style="color:teal">&nbsp;6</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">&nbsp;7</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:blue">double</span><span style="color:black">&nbsp;d;<br /> </span><span style="color:teal">&nbsp;8</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:blue">struct</span><span style="color:black"><br /> </span><span style="color:teal">&nbsp;9</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> </span><span style="color:teal">10</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;mantissal&nbsp;:&nbsp;32;<br /> </span><span style="color:teal">11</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;mantissah&nbsp;:&nbsp;20;<br /> </span><span style="color:teal">12</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;exponent&nbsp;:&nbsp;11;<br /> </span><span style="color:teal">13</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color:blue">int</span><span style="color:black">&nbsp;sign&nbsp;:&nbsp;1;<br /> </span><span style="color:teal">14</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /> </span><span style="color:teal">15</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;}&nbsp;ud;<br /> </span><span style="color:teal">16</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;ud.d&nbsp;=&nbsp;(</span><span style="color:blue">double</span><span style="color:black">)(bb&nbsp;&amp;&nbsp;~(bb&nbsp;&gt;&gt;&nbsp;32));<br /> </span><span style="color:teal">17</span>&nbsp;<span style="color:black">&nbsp;&nbsp;&nbsp;</span><span style="color:blue">return</span><span style="color:black">&nbsp;ud.exponent&nbsp;-&nbsp;1023;<br /> </span><span style="color:teal">18</span>&nbsp;<span style="color:black">}<br /> </span><span style="color:teal">19</span>&nbsp;</span></p>  <span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;;"><br /> </span><span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">以上</span><span style="font-size:12.0pt;font-family: &quot;Times New Roman&quot;;">uint64_t</span><span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">和</span><span style="font-size:12.0pt;font-family: &quot;Times New Roman&quot;;">uint32_t</span><span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">是新</span><span style="font-size:12.0pt;font-family: &quot;Times New Roman&quot;;">C++</span><span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">标准可以支持的整型，分别相当于</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;;">旧的unsigned long long</span><span style="font-size:12.0pt; font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">和</span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;;">unsigned long</span><span style="font-size:12.0pt;font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">类型。<span style="color:blue">以上代码不是我的原创，而是来自国外某位朋友，我稍微加工了一下贴到这里，版权属于原作者，如果我没有记错的话应该是</span></span><span style="font-size:12.0pt;font-family:&quot;Times New Roman&quot;;color:blue;">GNU</span><span style="font-size:12.0pt; font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">。</span></div></div><img src ="http://www.cppblog.com/Chipset/aggbug/154114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-23 12:41 <a href="http://www.cppblog.com/Chipset/archive/2011/08/23/154114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>慈善的是心而不是钱</title><link>http://www.cppblog.com/Chipset/archive/2011/08/19/153849.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Fri, 19 Aug 2011 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/19/153849.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153849.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/19/153849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153849.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153849.html</trackback:ping><description><![CDATA[<div><p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312">2007年初，刚刚卸任的联合国秘书长安南，在德克萨斯州的一个庄园里举行了一场慈善晚宴，旨在为非洲贫困儿童募捐。应邀参加晚宴的都是富商和社会名流。在晚宴将要开始的时候，一位老妇人领着一个小女孩来到了庄园的入口处，小女孩手里捧着一个看上去很精致的瓷罐。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&nbsp;守在庄园入口处的保安安东尼拦住了这一老一小。&#8220;欢迎你们，请出示请柬，谢谢。&#8221;。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&#8220;请柬，对不起，我们没有接到邀请，是她要来，我陪她来的。&#8221;老妇人抚摸着小女孩的头。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&nbsp;&#8220;很抱歉，除了工作人员，没有请柬的人不能进去。&#8221;安东尼说。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&#8220;为什么？这里不是举行慈善晚宴吗？我们是来表示我们的心意的，难道不可以吗？&#8221;老妇人的表情很严肃，&#8220;可爱的小露西，从电视上知道了这里要为非洲的孩子们举行慈善活动，她很想为那些可怜的孩子做点事，决定把自己储钱罐里所有的钱都拿出来，我可以不进去，真的不能让她进去吗？&#8221;</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&#8220;是的，这里将要举行一场慈善晚宴，应邀参加的都是很重要的人士，他们将为非洲的孩子慷慨解囊。很高兴你们带着爱心来到这里，但是，我想这场合不适合你们进去。&#8221;安东尼解释说。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">&#8220;叔叔，慈善的不是钱，是心，对吗？&#8221;一直没有说话的小女孩问安东尼，她的话让安东尼愣住了。&#8220;我知道收到邀请的人有很多钱，他们会拿出很多钱，我没有那么多，但这是我所有的钱啊，如果我真的不能进去，请帮我把这个带进去吧！&#8221;小女孩露西说完，将手中的储钱罐递给安东尼。</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">安东尼不知道是接还是不接，正在他不知所措的时候，突然有人说：&#8220;不用了，孩子，你说得对，慈善的不是钱，是心，你可以进去，所有有爱心的人都可以进去。&#8221;说话的是一位老头，他面带微笑，站在小露西身旁。他躬身和小露西交谈了几句，然后直身起来，拿出一份请柬递给安东尼：&#8220;我可以带她进去吗？&#8221;</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">安东尼接过请柬，打开一看，忙向老头敬了个礼：&#8220;当然可以了，沃伦&#183;巴菲特先生。&#8221;</span></p> <p style="line-height: 150%; margin-top: 0px; text-indent: 24px; margin-bottom: 0px"><span style="font-family: 仿宋_GB2312; color: #333333">当天慈善晚宴的主角不是倡议者的安南，不是捐出300万美元的巴菲特，也不是捐出800万美元的比尔&#183;盖茨，而是仅仅捐出30美元零25美分的小露西，她赢得了最多最热烈的掌声。而晚宴的主题标语也变成了这样一句话&#8220;慈善的不是钱，是心。&#8221;第二天，美国各大媒体纷纷以这句话作为标题，报道了这次慈善晚宴。看到报道后，许多普普通通的美国人纷纷表示要为非洲那些贫穷的孩子捐赠。</span></p> </div><img src ="http://www.cppblog.com/Chipset/aggbug/153849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-19 14:47 <a href="http://www.cppblog.com/Chipset/archive/2011/08/19/153849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排序大比武</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153559.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 06:14:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153559.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153559.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153559.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 该比武只比速度，单线程测试随机正整数，不包括蜗牛排序，它弃权啦，哈哈。操作系统：Windows XP Pro SP3，英文版编译器：g++4.5.2(-O3)CPU： Intel Core2 Q9500内存：DDR3普条 1066MHz， 4GB  插入排序、选择排序和冒泡排序最慢，时间复杂度为O(n2)，希尔排序的速度依赖于使用的增量序列，堆排序、归并排序和改进的快速排序处于中等水平，时间复杂度...&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2011/08/16/153559.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/153559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 14:14 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分插入排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153557.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153557.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153557.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153557.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153557.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">二分插入排序</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">直接插入排序时后面的元素从后向前逐个比较寻找插入位置，有时候没有必要这样做，因为此时需要寻找合适插入位置的当前这个元素前面的子序列已经有序，如果使用二分查找插入位置往往可以减少平均搜索长度。对于一个待排序的随机序列而言，用二分插入排序取代直接插入排序，尽管总的移动元素次数不可能减少，但是可能减少总的平均比较次数。二分插入排序的平均时间复杂度为</span>O(n<sup>2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，最坏情况下的时间复杂度为</span>(n<sup>2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，当待排序序列已经有序时，排序时间复杂度为</span>O(nlogn)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。空间复杂度为</span>O(1)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。二分插入排序是否稳定依赖于具体实现。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">假设一个序列已经有序，此时我们需要向这个序列里插入一个新的值，那么我们如何找到合适的位置呢？</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">首先跟序列最中间的那个元素比较，如果比最中间的这个元素小，则插入位置在它的左边，否则在它的右边。以当前最中间位置为分割点，如果在左边，则当前最中间位置是待搜索子序列的终点，如果在右边，右边邻接的元素将是待搜索子序列的起点。按照这种原则，继续寻找下一个中间位置，并继续这种过程，直到找到合适的插入位置为止。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">问题是何谓合适的插入位置？如果序列中有一个元素与当前待插入的元素值相等，那么插入位置应该选在该元素的前面还是后面呢？选在后面则二分插入排序稳定，选在前面则二分插入排序不稳定。如果序列中有多个元素与当前待插入的元素值相等，插入位置选在哪里呢？选在最后一个的后面则二分插入排序稳定，其它情况均不稳定。这里的&#8220;前面&#8221;位置和&#8220;后面&#8221;位置通常被称为上界和下界。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">还有，对数组二分插入排序比较简单，那么能对链表进行二分插入排序吗？理论上没有什么问题，如果希望代码复用程度高的话，链表需要提供迭代器。问题关键不在于代码复用性怎么样，而是插入排序的速度太慢，一般不采纳。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">使用二分插入排序对一个无序序列排序的场合极其罕见，因为太多的时候让一个静态序列有序则有更快的排序算法可以选用，当一个序列很短时，直接插入排序由于开销小比二分插入排序要快一点，当待排序序列较长时有很多排序算法</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">本文后面会介绍一些</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">均比二分插入排序快得多。</span></p>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIter,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;linear_binary_insertion(RandomIter&nbsp;first,&nbsp;RandomIter<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last,&nbsp;T&nbsp;value,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIter&nbsp;curr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;upper_bound(first,&nbsp;last,&nbsp;value,&nbsp;cmp);&nbsp; // 见本主页的原地归并排序介绍<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;copy_backward(curr,&nbsp;last,&nbsp;last&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 暂且需要用标准库，将来也许添加该部分的代码<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">curr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIter,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;binary_insertion_sort(RandomIter&nbsp;first,&nbsp;RandomIter&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomIter&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;it&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">it)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;linear_binary_insertion(first,&nbsp;it,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it,&nbsp;cmp);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 14:08 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>桶排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153556.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153556.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153556.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153556.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153556.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">桶排序</span> </p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">当待排序的随机序列密集的分布于一个狭窄区间时，使用计数排序速度比较快，当待排序的随机序列比较均匀的分布于一个较宽区间时，可以考虑使用桶排序。桶排序的时间复杂度为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度也为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p style="line-height:150%">&nbsp;<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">既然一个待排序的随机序列比较均匀的分布于一个区间，就很容易散列到各个桶中，假设有</span> n <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个元素比较均匀的散列到</span> m <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个桶中，则每个桶中的元素数目约为</span> n/m<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，可以使用普通排序算法对每个桶中的元素排序，排序完毕后再把所有元素复制到最初序列的位置覆盖原始序列。实际应中</span>n/m <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">通常很小，可以使用直接插入排序给每个桶中的元素排序，总的时间复杂度为</span>O(n + m*(n/m)<sup>2</sup> + n) = O(n<sup>2</sup>/m + 2n) &nbsp;= O(n)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">。如果每个桶的元素用链表存储，链表可以用归并排序，各桶排序完毕后把各个链表连接起来就可以了，省去一次复制元素的麻烦，这样操作的时间复杂度为</span>O(n + m(n/m)log(n/m)) = O(n + nlogk) = O(n)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以随机整数为例，桶排序过程如下表。</span></p>  <table style="margin-left: 5.4pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" height="204" width="690">  <tbody><tr style="height:7.65pt">   <td style="width:4.25in;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:7.65pt" valign="top" width="408">   <p>48&nbsp;40&nbsp;66&nbsp;91&nbsp;47&nbsp;68&nbsp;31&nbsp;30&nbsp;29&nbsp;23&nbsp;99&nbsp;35&nbsp;23&nbsp;88&nbsp;88&nbsp;87</p>   </td>   <td style="width:1.75in;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:7.65pt" valign="top" width="168">   <p><span style="font-family: SimSun;">待排序的随机序列</span></p>   </td>  </tr>  <tr style="height:10.35pt">   <td style="width:4.25in;border:none;padding:0in 5.4pt 0in 5.4pt;height:10.35pt" valign="top" width="408">   <p>01 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 &nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;8<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   </span>&nbsp;&nbsp;9&nbsp;&nbsp; </p>   </td>   <td style="width:1.75in;border:none;padding:0in 5.4pt 0in 5.4pt;height:10.35pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">桶号</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:4.25in;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="408">   <p>&nbsp;&nbsp;&nbsp;&nbsp; 29 23 23&nbsp;&nbsp; 31 30 35<span>&nbsp;&nbsp;   </span>48 40 47&nbsp;&nbsp; 66 68&nbsp;&nbsp; 88 88 87<span>&nbsp;&nbsp;   </span>91 99&nbsp;&nbsp; </p>   </td>   <td style="width:1.75in;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">散列</span>(/10)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">到各个桶内</span></p>   </td>  </tr>  <tr style="height:7.15pt">   <td style="width:4.25in;padding:0in 5.4pt 0in 5.4pt;   height:7.15pt" valign="top" width="408">   <p>&nbsp;&nbsp;&nbsp;&nbsp; 23 23 29&nbsp;&nbsp; 30 31 35<span>&nbsp;&nbsp;   </span>40 47 48&nbsp;&nbsp; 66 68&nbsp;&nbsp; 87 88 88<span>&nbsp;&nbsp;   </span>91 99&nbsp;</p>   </td>   <td style="width:1.75in;padding:0in 5.4pt 0in 5.4pt;   height:7.15pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">各桶分别排序</span></p>   </td>  </tr>  <tr style="height:9.9pt">   <td style="width:4.25in;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:9.9pt" valign="top" width="408">   <p>23&nbsp;23&nbsp;29&nbsp;30&nbsp;31&nbsp;35&nbsp;40&nbsp;47&nbsp;48&nbsp;66&nbsp;68&nbsp;87&nbsp;88&nbsp;88&nbsp;91&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>   </td>   <td style="width:1.75in;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:9.9pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">最终排序结果</span></p>   </td>  </tr> </tbody></table>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">inline&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;power2ceil(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">x;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">|=</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;x&nbsp;|=&nbsp;x&nbsp;&gt;&gt;&nbsp;32;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">x;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">inline&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;hash_bits(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;x)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;sum&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(;&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;x&nbsp;</span><span style="color: #000000; ">&gt;&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">sum;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;sum;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;non-portable&nbsp;implementation</span><span style="color: #008000; "> only for unsigned long type<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;bucket_sort(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;max&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">max_element(v.begin(),&nbsp;v.end());&nbsp; // 见本主页的计数排序<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;min&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">min_element(v.begin(),&nbsp;v.end());&nbsp;&nbsp;&nbsp; // 见本主页的计数排序<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;max_bits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;hash_bits(power2ceil(max&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;min));<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;hash_bits(power2ceil(v.size())&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;bins&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;offset&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(max_bits&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">&nbsp;:&nbsp;max_bits&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;pits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">128</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;typedef&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;VECTOR;<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">VECTOR</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vec(bins&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(VECTOR::size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;vec.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vec[i].reserve(pits);<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(VECTOR::size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vec[(v[i]&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;min)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;offset].push_back(v[i]);<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(VECTOR::size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;vec.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;insertion_sort(vec[i].begin(),&nbsp;vec[i].end(),&nbsp;cmp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 插入排序见本主页的快排<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">VECTOR</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;vec.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(VECTOR::size_type&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;vec[i].size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">j)<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v[k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec[i][j];<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 14:03 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计数排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153555.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:58:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153555.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153555.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153555.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153555.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">计数排序</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">如果给一个分布于区间</span>[min, max)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的随机序列排序，可以考虑使用计数排序，</span>max-min <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">越小说明分布越集中，此时使用计数排序效果就越好，计数排序是一种稳定的排序算法。一般而言，计数排序的时间复杂度为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，从理论上来看，它比时间复杂度</span>O(nlogn)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的算法明显快一些。</span></p>  <p style="line-height:150%">&nbsp;<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">使用计数排序算法对一个正整数序列进行升序排序时，假设对于某个元素比它小的元素个数为</span> i(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">其中</span>0<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">&#8804;</span>i&lt;max<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，获取该信息无需借助比较运算</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，则排序后该元素就应该位于数组下标为</span>i<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的位置。现在的问题是，如果对于等于某个值的正整数不止一个该如何确定各自位置呢？这个问题在实现中容易解决。</span></p>  <p style="line-height:150%">&nbsp;<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">为了能够正常排序，需要用</span>max-min <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个辅助空间记录不同正整数的个数，由于排序无法原地进行，还需要开辟等大的辅助空间容纳排序后的所有正整数，一般而言，</span>max-min <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">不大于待排序的正整数个数或与之相当，可见空间复杂度为</span>O(n + (max-min)) = O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以一个随机整数序列为例，计数排序过程如下。</span></p>  <table style="margin-left:5.4pt;border-collapse:collapse;" border="0" cellpadding="0" cellspacing="0">  <tbody><tr style="height:3.5pt">   <td style="width:333.0pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="444">   <p>13&nbsp;11&nbsp;13&nbsp;11&nbsp;13&nbsp;12&nbsp;15&nbsp;17&nbsp;15</p>   </td>   <td style="width:1.25in;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="120">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">待排序序列</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:333.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="444">   <p>0&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 2<span>&nbsp;&nbsp;&nbsp;   </span>3&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; 5<span>&nbsp;&nbsp;&nbsp;   </span>6&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp; &nbsp;8</p>   </td>   <td style="width:1.25in;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="120">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">计数数组下标</span></p>   </td>  </tr>  <tr style="height:12.0pt">   <td style="width:333.0pt;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="444">   <p>1&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 1<span>&nbsp;&nbsp;&nbsp;   </span>4&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 5<span>&nbsp;&nbsp;&nbsp;   </span>1&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 1</p>   </td>   <td style="width:1.25in;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="120">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">依次计数</span></p>   </td>  </tr>  <tr style="height:15.0pt">   <td style="width:333.0pt;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="444">   <p>1&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; 4<span>&nbsp;&nbsp;&nbsp;   </span>8&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp; 13&nbsp;14&nbsp;15&nbsp;16</p>   </td>   <td style="width:1.25in;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="120">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">计数累计</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:333.0pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="444">   <p>10&nbsp;11&nbsp;11&nbsp;12&nbsp;13&nbsp;13&nbsp;13&nbsp;13&nbsp;15</p>   </td>   <td style="width:1.25in;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="120">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">根据累计归位</span></p>   </td>  </tr> </tbody></table>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIter</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;ForwardIter&nbsp;max_element(ForwardIter&nbsp;first,&nbsp;ForwardIter&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ForwardIter&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first)<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;it;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIter</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;ForwardIter&nbsp;min_element(ForwardIter&nbsp;first,&nbsp;ForwardIter&nbsp;last)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ForwardIter&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it)<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;it;<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;not&nbsp;portable&nbsp;implementation</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;counting_sort(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;s)<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(s.empty()&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;s.size())<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;typedef&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::value_type&nbsp;value_type;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;value_type&nbsp;max&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">max_element(s.begin(),&nbsp;s.end());<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;value_type&nbsp;min&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">min_element(s.begin(),&nbsp;s.end());<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;typedef&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::size_type&nbsp;size_type;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;h(max&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;min&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">),&nbsp;d(s.size());<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;s.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">h[s[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">min];<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;h.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;h[i]&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;h[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(size_type&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;s.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;d[</span><span style="color: #000000; ">--</span><span style="color: #000000; ">h[s[i]</span><span style="color: #000000; ">-</span><span style="color: #000000; ">min]]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s[i];<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;s.swap(d);<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:58 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二路归并排序(非原地进行，需要缓冲区)</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153553.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:55:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153553.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153553.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153553.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153553.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">二路归并</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">如果内存充足，可以考虑使用非原地的归并排序获得更快的速度。非原地的归并排序算法空间复杂度为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，时间复杂度</span>O(nlogn)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">。它的核心是归并，下面看看归并的基本实现过程。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">待排序序列：</span> </p>  <p style="line-height:150%"><span>52, 50, 50, 74, 61, 46, 84, 85, 73, 23, 94, 53, 97, 98, 65, 87, 29, 13, 61, 58, 19 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">可以把上面的无序序列分成四段并对各段进行插入排序，得到四个有序子序列：</span> </p>  <p style="line-height:150%"><span>46, 50, 50, 52, 61, 74, 84, 23, 73, 85, 94, 13, 29, 53, 65, 87, 97, 98, 19, 58, 61 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">两两归并成一段，得到两个有序子序列：</span> </p>  <p style="line-height:150%"><span>23, 46, 50, 50, 52, 61, 73, 74, 84, 85, 94, 13, 19, 29, 53, 58, 61, 65, 87, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">归并成一个有序序列，排序完成。</span></p>  <p style="line-height:150%"><span>13, 19, 23, 29, 46, 50, 50, 52, 53, 58, 61, 61, 65, 73, 74, 84, 85, 87, 94, 97, 98</span></p>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;InputIterator,&nbsp;typename&nbsp;OutputIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000; ">OutputIterator&nbsp;merge(InputIterator&nbsp;first1,&nbsp;InputIterator&nbsp;last1,&nbsp;InputIterator&nbsp;first2,<br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputIterator&nbsp;last2,&nbsp;OutputIterator&nbsp;result,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(first1&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last1&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;first2&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last2)<br /></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first2,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first1))<br /></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first2;<br /></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first2;<br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first1;<br /></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first1;<br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">result;<br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;copy(first2,&nbsp;last2,&nbsp;copy(first1,&nbsp;last1,&nbsp;result));<br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;merge_sort_loop(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;result,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;step_size,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;two_steps&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;step_size&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;two_steps)<br /></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;merge(first,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;step_size,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;step_size,<br /></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;two_steps,&nbsp;result,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;two_steps;<br /></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;step_size)<br /></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;step_size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge(first,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;step_size,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;step_size,&nbsp;last,&nbsp;result,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;chunk_insertion(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;chunk_size,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;chunk_size)<br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;insertion_sort(first,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;chunk_size,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;chunk_size;<br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;insertion_sort(first,&nbsp;last,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;merge_with_buffer(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;buffer,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;buffer_last&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;buffer&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;len;<br /></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;step_size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;chunk_insertion(first,&nbsp;last,&nbsp;step_size,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(step_size&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;len)<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;merge_sort_loop(first,&nbsp;last,&nbsp;buffer,&nbsp;step_size,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;step_size&nbsp;</span><span style="color: #000000; ">&lt;&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;merge_sort_loop(buffer,&nbsp;buffer_last,&nbsp;first,&nbsp;step_size,&nbsp;cmp);<br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;step_size&nbsp;</span><span style="color: #000000; ">&lt;&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #000000; ">RandomIterator&nbsp;merge_backward(RandomIterator&nbsp;first1,&nbsp;RandomIterator&nbsp;last1,<br /></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;first2,&nbsp;RandomIterator&nbsp;last2,<br /></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;result,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first1&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last1)<br /></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;copy_backward(first2,&nbsp;last2,&nbsp;result);<br /></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first2&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last2)<br /></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;copy_backward(first1,&nbsp;last1,&nbsp;result);<br /></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">last1,&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">last2;<br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last2,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last1))<br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*--</span><span style="color: #000000; ">result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last1;<br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first1&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last1)<br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;copy_backward(first2,&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">last2,&nbsp;result);<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">last1;<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*--</span><span style="color: #000000; ">result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last2;<br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first2&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last2)<br /></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;copy_backward(first1,&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">last1,&nbsp;result);<br /></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">last2;<br /></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;buffered_merge_sort_adaptive(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;buffer,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;((last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge_with_buffer(first,&nbsp;middle,&nbsp;buffer,&nbsp;cmp);<br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge_with_buffer(middle,&nbsp;last,&nbsp;buffer,&nbsp;cmp);<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;middle&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first,&nbsp;len2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;middle;<br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len1&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;len2)<br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;buffer_end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;copy(first,&nbsp;middle,&nbsp;buffer);<br /></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;merge(buffer,&nbsp;buffer_end,&nbsp;middle,&nbsp;last,&nbsp;first,&nbsp;cmp);<br /></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">107</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">108</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">109</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;buffer_end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;copy(middle,&nbsp;last,&nbsp;buffer);<br /></span><span style="color: #008080; ">110</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;merge_backward(first,&nbsp;middle,&nbsp;buffer,&nbsp;buffer_end,&nbsp;last,&nbsp;cmp);<br /></span><span style="color: #008080; ">111</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">112</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">113</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">114</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">115</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;buffered_merge_sort_aux(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp,&nbsp;T)<br /></span><span style="color: #008080; ">116</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">117</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;buf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">(std::nothrow)T[last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first];<br /></span><span style="color: #008080; ">118</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;buf)<br /></span><span style="color: #008080; ">119</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;buffered_merge_sort_adaptive(first,&nbsp;last,&nbsp;buf,&nbsp;cmp);<br /></span><span style="color: #008080; ">120</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;delete&nbsp;[]&nbsp;buf;<br /></span><span style="color: #008080; ">121</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">122</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">123</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">124</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;buffered_merge_sort(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">125</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">126</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">127</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;buffered_merge_sort_aux(first,&nbsp;last,&nbsp;cmp,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first);<br /></span><span style="color: #008080; ">128</span>&nbsp;<span style="color: #000000; ">}</span></div><br />以上代码实现中用到了直接插入排序和拷贝算法，直接插入排序见本主页快排的介绍，拷贝算法见标准库，本主页暂无介绍(以后也许会加上)。<img src ="http://www.cppblog.com/Chipset/aggbug/153553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:55 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原地归并排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153552.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153552.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153552.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153552.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">原地归并排序的时间复杂度为</span>O(nlog<sup>2</sup>n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度为</span>O(logn)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，相对于传统的非原地归并排序</span>(<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">时间复杂度</span>O(nlogn)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度</span>O(n))<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">而言，十分节约内存，但排序速度稍慢。在内存紧张且需要排序稳定的场合，原地稳定排序可以发挥其特长。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">在介绍原地稳定排序的原理之前，需要先了解两个基本算法，旋转和二分查找。</span></p>  <p style="line-height:150%">a) <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">旋转</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">旋转又称循环移动，假设有这样一个序列：</span>e<sub>0</sub>, e<sub>1</sub>, &#8230;, e<sub>i-1</sub>, e<sub>i</sub>, e<sub>i+1</sub>, &#8230;, e<sub>n-1</sub>, e<sub>n</sub><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。现在我们需要把它向左循环移动</span>i<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个位置变成：</span>e<sub>i</sub>, e<sub>i+1</sub>, &#8230;, e<sub>n-1</sub>, e<sub>n, </sub>e<sub>0</sub>, e<sub>1</sub>, &#8230;, e<sub>i-1</sub><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。为了尽可能的节约内存和保证较快的速度，我们可以在时间复杂度</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度</span>O(1)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的情况下达到目的。一种解决方案如下：</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">把原始序列看成两个子序列：</span>e<sub>0</sub>, e<sub>1</sub>, &#8230;, e<sub>i-1</sub><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">和</span>e<sub>i</sub>, e<sub>i+1</sub>, &#8230;, e<sub>n-1</sub>, e<sub>n</sub></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">把这两个子序列分别逆序得：</span>e<sub>i-1</sub>, &#8230;, e<sub>1</sub>, e<sub>0</sub><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">和</span>e<sub>n, </sub>e<sub>n-1</sub>, &#8230;, e<sub>i+1</sub>, e<sub>i</sub></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">也就是得到了这样一个序列：</span>e<sub>i-1</sub>, &#8230;, e<sub>1</sub>, e<sub>0</sub>, e<sub>n, </sub>e<sub>n-1</sub>, &#8230;, e<sub>i+1</sub>, e<sub>i</sub></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">再把上面的序列整体逆序得</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">：</span><span>e<sub>i</sub>, e<sub>i+1</sub>, &#8230;, e<sub>n-1</sub>, e<sub>n, </sub>e<sub>0</sub>, e<sub>1</sub>, &#8230;, e<sub>i-1</sub></span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">以上旋转过程的时间复杂度为</span>O(n/2) + O(n/2) + O(n) = O(2n) = O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，逆序时仅需要一个元素的辅助空间，空间复杂度</span>O(1)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">。</span></p>  <p style="line-height:150%">b) <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">二分查找</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">二分查找比较简单，在前面的二分插入排序算法里使用了二分查找获得上界</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">假设序列升序，序列中最后一个相同值的下一个位置或没有相同值时刚好比它大的那一个元素位置</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。这里看看怎么使用二分查找获得下界</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">假设序列升序，序列中第一个相同值的位置或没有相同值时刚好比它小的那一个元素位置</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">下面以整数为例，看看怎么获得下界。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">假设在一个有序序列</span>10, 12, 12, 13, 13, 13 14, 14, 17, 17, 18, 19, 19<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">中查找</span>16<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">该序列长度为</span>13<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，找到中间值</span>14<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，它比</span>16<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">小，查找的子序列长度降为</span>6<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，在子序列</span>[14, 19]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">中继续查找。找到中值</span>18<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，它比</span>16<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">大，查找的子序列长度降为</span>3<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，在子序列</span>[14, 17]<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">中继续查找。找到中值</span>17<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，它比</span>16<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">大，查找的子序列长度降为</span>1<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">，在子序列</span>[14, 14]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">中继续查找，找到</span>14<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，它比</span>16<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">大，查找的子序列长度降为</span>0<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，查找失败。返回</span>14<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">后面的元素位置，即第一个</span>17<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">的位置。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">使用二分查找的前提条件是待查序列必须有序。无论查找上界还是下界，以及是否查找成功，二分查找的时间复杂度为</span>O(logn)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。或许有些读者在有的书上见过有的二分查找算法既不获得确定的上界也不获得确定的下界，可惜这样的二分查找算法除了考试以外似乎没有多大实用价值。</span></p>  <p style="line-height:150%">c) <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">原地稳定排序的原理</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">以整数为例，假设有一个需要稳定排序的无序序列：</span> </p>  <p style="line-height:150%">52, 50, 50, 74, 61, 46, 84, 85, 73, 23, 94, 53, 97, 98, 65, 87, 29 </p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">首先需要把较长的序列使用插入排序分成多个有序的短序列。上面的序列可以分成两个子序列，然后分别进行插入排序，得到：</span> </p>  <p style="line-height:150%"><strong>46, 50, 50, 52, 61, 74, 84, 85</strong>, 23, 29, 53, 65, 73, 87, 94, 97, 98 </p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在前段</span><span>[46, 85]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">查找后段</span>[23, 98]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">的中值得</span>73<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>74<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，这样后段</span><span>[23, 98]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">的前部分</span>[23, 65]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">中的任何元素比前段</span>[46, 85]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">的后部分</span>[74, 85]<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">任何元素都小，旋转这两部分，得到：</span> </p>  <p style="line-height:150%"><span>46, 50, 50, 52, 61, <strong>23, 29, 53, 65, 74, 84, 85</strong>, 73, 87, 94, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在</span><span>[23, 85]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">中查找</span>[46, 61]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">的中值</span>50<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>53<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，旋转</span><span>[50, 61]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">和</span>[23, 29]<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，得到：</span> </p>  <p style="line-height:150%"><span>46, 50, <strong>23, 29, 50, 52, 61</strong>, 53, 65, 74, 84, 85, 73, 87, 94, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在</span><span>[46, 50]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">之间查找</span>29<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>46<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，旋转得到：</span> </p>  <p style="line-height:150%"><span>23, <strong>46, 50</strong>, 29, 50, 52, 61, 53, 65, 74, 84, 85, 73, 87, 94, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在</span><span>[29, 29]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">之间查找</span>50<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>50<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，旋转得到：</span> </p>  <p style="line-height:150%"><span>23, <strong>29, 46, 50</strong>, 50, 52, 61, 53, 65, 74, 84, 85, 73, 87, 94, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在</span><span>[53, 65]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">之间查找</span>52<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>53<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，旋转，得到：</span> </p>  <p style="line-height:150%"><span>23, 29, 46, 50, 50, 52, <strong>53, 61, 65</strong>, 74, 84, 85, 73, 87, 94, 97, 98 </span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">在</span><span>[74, 85]</span><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">之间查找</span>94<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>73<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，在</span>[73, 87]<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">之间查找</span>84<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，返回</span>87<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，旋转得到：</span> </p>  <p style="line-height:150%">23, 29, 46, 50, 50, 52, 53, 61, 65, 74, <strong>73, 84, 85</strong>, 87, 94, 97, 98 </p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;;">交换</span>73 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">和</span>74<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;">，最终排序完毕。</span> </p>  <p style="line-height: 150%;"><span>23, 29, 46, 50, 50, 52, 53, 61, 65, <strong>73, 74</strong>, 84, 85, 87, 94, 97, 98</span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;cycly&nbsp;moving&nbsp;left&nbsp;middle&nbsp;-&nbsp;first&nbsp;vacancies</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;rotate(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;middle,&nbsp;RandomIterator&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;middle&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;last&nbsp;&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;middle)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;reverse(first,&nbsp;&nbsp;middle);<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;reverse(middle,&nbsp;last);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;middle&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;middle&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first,&nbsp;</span><span style="color: #000000; ">*--</span><span style="color: #000000; ">last);<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;}<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;middle)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;reverse(middle,&nbsp;last);<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;reverse(first,&nbsp;middle);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;find&nbsp;the&nbsp;lower&nbsp;bound,&nbsp;the&nbsp;returned&nbsp;value&nbsp;is&nbsp;the&nbsp;address&nbsp;of&nbsp;that&nbsp;bound</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">RandomIterator&nbsp;lower_bound(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;value,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first,&nbsp;half;<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;middle;<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;half&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;half;<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">middle,&nbsp;value))<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;middle;<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;half&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;half;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;find&nbsp;the&nbsp;upper&nbsp;bound,&nbsp;the&nbsp;returned&nbsp;value&nbsp;is&nbsp;the&nbsp;address&nbsp;of&nbsp;that&nbsp;bound</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">RandomIterator&nbsp;upper_bound(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;value,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first,&nbsp;half;<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;middle;<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;half&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;half;<br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(value,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">middle))<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;half;<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;middle;<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first;<br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;half&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000;">}</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;no&nbsp;heap&nbsp;memory&nbsp;needed&nbsp;to&nbsp;merge&nbsp;two&nbsp;sequence</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;merge_without_buffer(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;middle,<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;last,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len1,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len2,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">||</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; ">&nbsp;len2)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;len2)<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">middle,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first))&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">middle);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;first_cut&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first,&nbsp;second_cut&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;middle;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len11&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;len22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len1&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;len2)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len11&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len1&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;first_cut&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;len11;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;second_cut&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lower_bound(middle,&nbsp;last,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first_cut,&nbsp;cmp);<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;second_cut&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;middle;<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;len2&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;second_cut&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;len22;<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;first_cut&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;upper_bound(first,&nbsp;middle,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">second_cut,&nbsp;cmp);<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;len11&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first_cut&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;rotate(first_cut,&nbsp;middle,&nbsp;second_cut);<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;new_middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first_cut&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(second_cut&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;middle);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge_without_buffer(first,&nbsp;first_cut,&nbsp;new_middle,&nbsp;len11,&nbsp;len22,&nbsp;cmp);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge_without_buffer(new_middle,&nbsp;second_cut,&nbsp;last,&nbsp;len1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;len11,&nbsp;len2&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;len22,&nbsp;cmp);<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;inplace&nbsp;merge&nbsp;sort</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;inplace_merge_sort(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">17</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;insertion_sort(first,&nbsp;last,&nbsp;cmp);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;RandomIterator&nbsp;middle&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;((last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;inplace_merge_sort(first,&nbsp;middle,&nbsp;cmp);<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;inplace_merge_sort(middle,&nbsp;last,&nbsp;cmp);<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;merge_without_buffer(first,&nbsp;middle,&nbsp;last,&nbsp;middle&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first,&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;middle,&nbsp;cmp);<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">}</span></div><p style="line-height: 150%;">以上代码实现中用到了直接插入排序，该部分内容见本主页的快排介绍。<br /><span></span></p>  </div><img src ="http://www.cppblog.com/Chipset/aggbug/153552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:49 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选择排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153551.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153551.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153551.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153551.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153551.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">选择排序</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">假设一个待排序的序列中有</span> n <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个元素，从这</span> n <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个元素中选出一个最小</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">大</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的元素放在第</span> 0 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个元素的位置，再从余下的</span> n-1 <span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">元素中选出一个次小</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">大</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的元素放在第</span> 1 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个元素的位置，继续这个过程</span>...<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，经过</span> n-1 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">次选择和交换，整个序列成为一个升</span>(<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">降</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">序序列，这就是选择排序的排序过程。无论最好还是最坏情况，选择排序的时间复杂度始终为</span>O(n<sup>2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度为</span>O(1)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，选择排序并不稳定。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以一个随机整数序列为例，选择排序过程见下表。</span></p>  <table style="width:436.0pt;margin-left:1.4pt;border-collapse:collapse;border:none;" border="1" cellpadding="0" cellspacing="0" width="581">  <tbody><tr style="height:8.5pt">   <td style="width:319.0pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:8.5pt" valign="top" width="425">   <p>49&nbsp;52&nbsp;53&nbsp;39&nbsp;86&nbsp;97&nbsp;21&nbsp;85&nbsp;64&nbsp;31&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;42&nbsp;14</p>   </td>   <td style="width:117.0pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:8.5pt" valign="top" width="156">   <p style="margin-left:3.85pt"><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">待排序序列</span> </p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="425">   <p><strong>14</strong>&nbsp;52&nbsp;53&nbsp;39&nbsp;86&nbsp;97&nbsp;21&nbsp;85&nbsp;64&nbsp;31&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;42&nbsp;<strong>49</strong></p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">49 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>14 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:15.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="425">   <p>14&nbsp;<strong>21</strong>&nbsp;53&nbsp;39&nbsp;86&nbsp;97&nbsp;<strong>52</strong>&nbsp;85&nbsp;64&nbsp;31&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;42&nbsp;49</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="156">   <p style="margin-left:3.85pt">52 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>21 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:9.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:9.0pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;<strong>31 </strong>&nbsp;39&nbsp;86&nbsp;97&nbsp;52&nbsp;85&nbsp;64&nbsp;<strong>53</strong>&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;42&nbsp;49</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:9.0pt" valign="top" width="156">   <p style="margin-left:3.85pt">53 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>31 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:12.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;<strong>39</strong>&nbsp;86&nbsp;97&nbsp;52&nbsp;85&nbsp;64&nbsp;53&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;42&nbsp;49</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="156">   <p style="margin-left:3.85pt">39 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:15.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;<strong>42</strong>&nbsp;97&nbsp;52&nbsp;85&nbsp;64&nbsp;53&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;<strong>86</strong>&nbsp;49</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="156">   <p style="margin-left:3.85pt">86 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>42 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;<strong>49</strong>&nbsp;52&nbsp;85&nbsp;64&nbsp;53&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;86&nbsp;<strong>97</strong></p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">97 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>49 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:12.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;<strong>52</strong>&nbsp;85&nbsp;64&nbsp;53&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="156">   <p style="margin-left:3.85pt">52 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:15.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.75pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;<strong>53</strong>&nbsp;64&nbsp;<strong>85</strong>&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.75pt" valign="top" width="156">   <p style="margin-left:3.85pt">85 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>53 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;<strong>64</strong>&nbsp;85&nbsp;80&nbsp;65&nbsp;73&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">64 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:12.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;<strong>65</strong>&nbsp;80&nbsp;<strong>85</strong>&nbsp;73&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="156">   <p style="margin-left:3.85pt">85 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>65 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:16.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="425">   <p>14 &nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;<strong>73</strong>&nbsp;85&nbsp;<strong>80</strong>&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">80 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>73 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;73&nbsp;<strong>80</strong>&nbsp;<strong>85</strong>&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">85 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">与</span>80 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">交换后</span>   </p>   </td>  </tr>  <tr style="height:13.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:13.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;73&nbsp;80&nbsp;<strong>85</strong>&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:13.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">85 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:16.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;73&nbsp;80&nbsp;85&nbsp;<strong>85</strong>&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">85 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:8.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:8.5pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;73&nbsp;80&nbsp;85&nbsp;85&nbsp;<strong>86</strong>&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:8.5pt" valign="top" width="156">   <p style="margin-left:3.85pt">86 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">无需交换</span> </p>   </td>  </tr>  <tr style="height:12.1pt">   <td style="width:319.0pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:12.1pt" valign="top" width="425">   <p>14&nbsp;21&nbsp;31&nbsp;39&nbsp;42&nbsp;49&nbsp;52&nbsp;53&nbsp;64&nbsp;65&nbsp;73&nbsp;80&nbsp;85&nbsp;85&nbsp;86&nbsp;97</p>   </td>   <td style="width:117.0pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:12.1pt" valign="top" width="156">   <p style="margin-left:3.85pt"><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">排序完毕</span> </p>   </td>  </tr> </tbody></table>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">ForwardIterator&nbsp;selection(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;ForwardIterator&nbsp;next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first;&nbsp;first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first)<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">next))<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;next;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;selection_sort(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(ForwardIterator&nbsp;current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;&nbsp;first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first,&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">current)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;selection(first,&nbsp;last,&nbsp;cmp);<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(it&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;current)<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">current,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it); // 用于交换两个元素的swap函数实现见本主页快排的介绍<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:41 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>冒泡排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153550.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:39:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153550.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153550.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153550.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153550.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">冒泡排序</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">水底的气泡是逐渐上浮的，而不是一下子就到达水面。冒泡排序与之类似，当用冒泡排序算法对一个无序序列升序排序时，后面较小的元素与前面较大的元素逐个交换位置，直到无元素交换为止，则整个序列成为一个有序序列。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">冒泡排序的时间复杂度为</span>O(n<sup>2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，空间复杂度为</span>O(1)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，当原始序列已经有序，则冒泡排序的时间复杂度为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。当待排序序列基本有序时，使用冒泡排序速度往往比较快。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以一个整数序列的为例，冒泡排序过程见下表。</span></p>  <table style="width:436.0pt;margin-left:1.4pt;border-collapse:collapse;border:none;" border="1" cellpadding="0" cellspacing="0" width="581">  <tbody><tr style="height:8.5pt">   <td style="width:319.0pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:8.5pt" valign="top" width="425">   <p>90&nbsp;29&nbsp;11&nbsp;51&nbsp;38&nbsp;38&nbsp;27&nbsp;95&nbsp;18&nbsp;24&nbsp;52&nbsp;35&nbsp;77&nbsp;93&nbsp;40&nbsp;75</p>   </td>   <td style="width:117.0pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:8.5pt" valign="top" width="156">   <p style="margin-left:3.85pt"><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">待排序序列</span> </p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="425">   <p><strong>11</strong>&nbsp;90&nbsp;29&nbsp;<strong>18</strong>&nbsp;51&nbsp;38&nbsp;38&nbsp;27&nbsp;95&nbsp;24&nbsp;<strong>35</strong>&nbsp;52&nbsp;<strong>40</strong>&nbsp;77&nbsp;93&nbsp;75 </p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:3.5pt" valign="top" width="156">   <p>1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:15.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="425">   <p>11&nbsp;<strong>18</strong>&nbsp;90&nbsp;29&nbsp;<strong>24</strong>&nbsp;51&nbsp;38&nbsp;38&nbsp;27&nbsp;95&nbsp;35&nbsp;<strong>40</strong>&nbsp;52&nbsp;<strong>75</strong>&nbsp;77&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="156">   <p>2<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:9.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:9.0pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;<strong>24</strong>&nbsp;90&nbsp;29&nbsp;<strong>27</strong>&nbsp;51&nbsp;38&nbsp;38&nbsp;<strong>35</strong>&nbsp;95&nbsp;40&nbsp;52&nbsp;75&nbsp;77&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:9.0pt" valign="top" width="156">   <p>3 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:12.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;<strong>27</strong>&nbsp;90&nbsp;29&nbsp;<strong>35</strong>&nbsp;51&nbsp;38&nbsp;38&nbsp;<strong>40</strong>&nbsp;95&nbsp;52&nbsp;75&nbsp;77&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.0pt" valign="top" width="156">   <p>4<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:15.0pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;<strong>29</strong>&nbsp;90&nbsp;35&nbsp;38&nbsp;51&nbsp;<strong>38</strong>&nbsp;40&nbsp;<strong>52</strong>&nbsp;95&nbsp;75&nbsp;77&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.0pt" valign="top" width="156">   <p>5<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;<strong>35</strong>&nbsp;90&nbsp;<strong>38</strong>&nbsp;38&nbsp;51&nbsp;40&nbsp;52&nbsp;75&nbsp;<strong>95</strong>&nbsp;77&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p>6<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:12.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;<strong>38</strong>&nbsp;90&nbsp;38&nbsp;<strong>40</strong>&nbsp;51&nbsp;52&nbsp;75&nbsp;<strong>77</strong>&nbsp;95&nbsp;93</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="156">   <p>7<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:15.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.75pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;<strong>38</strong>&nbsp;90&nbsp;40&nbsp;51&nbsp;52&nbsp;75&nbsp;77&nbsp;<strong>93</strong>&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:15.75pt" valign="top" width="156">   <p>8<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;38&nbsp;<strong>40</strong>&nbsp;90&nbsp;51&nbsp;52&nbsp;75&nbsp;77&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p>9<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:12.75pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;38&nbsp;40&nbsp;<strong>51</strong>&nbsp;90&nbsp;52&nbsp;75&nbsp;77&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:12.75pt" valign="top" width="156">   <p>10<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:16.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;38&nbsp;40&nbsp;51&nbsp;<strong>52</strong>&nbsp;90&nbsp;75&nbsp;77&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="156">   <p>11<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38 &nbsp;38&nbsp;40&nbsp;51&nbsp;52&nbsp;<strong>75</strong>&nbsp;90&nbsp;77&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="156">   <p>12<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:13.5pt">   <td style="width:319.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:13.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;38&nbsp;40&nbsp;51&nbsp;52&nbsp;75&nbsp;<strong>77</strong>&nbsp;90&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:13.5pt" valign="top" width="156">   <p>13<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">趟后的结果</span></p>   </td>  </tr>  <tr style="height:16.5pt">   <td style="width:319.0pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="425">   <p>11&nbsp;18&nbsp;24&nbsp;27&nbsp;29&nbsp;35&nbsp;38&nbsp;38&nbsp;40&nbsp;51&nbsp;52&nbsp;75&nbsp;77&nbsp;90&nbsp;93&nbsp;95</p>   </td>   <td style="width:117.0pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:16.5pt" valign="top" width="156">   <p style="margin-left:3.85pt"><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">排序完毕</span></p>   </td>  </tr> </tbody></table>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;bubble_sort(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;exchanged&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;&nbsp;exchanged&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">first)<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;exchanged&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomIterator&nbsp;current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;current&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;first;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">current)<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomIterator&nbsp;prev&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">current,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">prev))<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">current,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">prev);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> 本主页介绍的快排里有swap实现</span><span style="color: #008000; ">，用于交换两个元素<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exchanged&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:39 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基数排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153549.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153549.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153549.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153549.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153549.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153549.html</trackback:ping><description><![CDATA[<div>  <p style="line-height: 150%;"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">基数排序有时也被称作卡片排序，也是一种时间复杂度为</span>O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的排序。为了给一个序列排序，基数排序需要大约相当的辅助空间</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">通常使用队列</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，可见空间复杂度为</span>O(n)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">。</span> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">假设有一个无序序列含有</span>n <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个整数，整数的基数是</span>k<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，最大有</span>d <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">位</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">例如：</span> <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">对于十进制整数而言，</span> k = 10<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，可能的值是</span> 0,&nbsp;1,&nbsp;2,&nbsp;...,&nbsp;8,&nbsp;9<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，在</span> 32 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">位系统上</span> d<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">&#8804;</span>10<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，在</span>64 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">位系统上</span> d<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">&#8804;</span>20)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，则基数排序的时间复杂度为</span>O(d(n+k)) = O(n)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">。当对整数排序时，使用</span>10<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">进制虽然比较容易理解，但是速度慢</span>(<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">因为为了得到各位数字需要做除法和取模等操作</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，为了尽可能的减小时间开销，通常使用</span>2 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的指数次幂进制</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">例如：</span>2, 4, 8, ..., 2<sup>r</sup><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span>r<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">为</span>2<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">进制的幂</span>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，这样可以借助位移运算减小耗费</span>CPU <span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">指令数，提升运行速度。对于</span>b<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">位</span>(<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">在</span>PC<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">机上，</span> b<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">通常为</span>32<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">或</span>64)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的整数而言，</span> d = b/r<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span> k = 2r<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，于是时间复杂度</span>O(d(n+k)) = O(b/r(n+2r))<span style="font-family: SimSun;">，理论上，当</span>b/r(n+2r)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">最小时，速度应该最快。</span> </p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以一个随机整数序列为例，基数排序的过程见下表。</span></p>  <table style="margin-left: 5.4pt; border-collapse: collapse; border: medium none;" border="1" cellpadding="0" cellspacing="0" height="190" width="771">  <tbody><tr style="height:4.0pt">   <td style="width:349.8pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:4.0pt" valign="top" width="466">   <p>178 207 982 510 477 295 963 095 274 614 810 579 700 618   301 766</p>   </td>   <td style="width:88.8pt;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:4.0pt" valign="top" width="118">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">待排序序序列</span></p>   </td>  </tr>  <tr style="height:6.25pt">   <td style="width:349.8pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:6.25pt" valign="top" width="466">   <p>51<strong>0</strong> 81<strong>0 </strong>70<strong>0</strong> 30<strong>1</strong> 98<strong>2</strong> 96<strong>3</strong> 27<strong>4</strong> 61<strong>4</strong> 29<strong>5</strong> 09<strong>5</strong> 76<strong>6</strong> 20<strong>7</strong> 47<strong>7</strong> 17<strong>8</strong> 61<strong>8</strong> 57<strong>9</strong>&nbsp;</p>   </td>   <td style="width:88.8pt;border:none;padding:0in 5.4pt 0in 5.4pt;height:6.25pt" valign="top" width="118">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">个位排序结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:349.8pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="466">   <p>7<strong>0</strong>0 3<strong>0</strong>1 2<strong>0</strong>7 5<strong>1</strong>0 8<strong>1</strong>0 6<strong>1</strong>4 6<strong>1</strong>8 9<strong>6</strong>3 7<strong>6</strong>6 2<strong>7</strong>4 4<strong>7</strong>7 1<strong>7</strong>8 5<strong>7</strong>9 9<strong>8</strong>2 2<strong>9</strong>5 0<strong>9</strong>5</p>   </td>   <td style="width:88.8pt;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="118">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">十位排序结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:349.8pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="466">   <p><strong>0</strong>95 <strong>1</strong>78 <strong>2</strong>07 <strong>2</strong>74 <strong>2</strong>95 <strong>3</strong>01 <strong>4</strong>77 <strong>5</strong>10 <strong>5</strong>79 <strong>6</strong>14 <strong>6</strong>18 <strong>7</strong>00 <strong>7</strong>66 <strong>8</strong>10 <strong>9</strong>63 <strong>9</strong>82</p>   </td>   <td style="width:88.8pt;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="118">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">百位排序结果</span></p>   </td>  </tr> </tbody></table>  <span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;"><br />以上是以基数为</span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;;">10</span><span style="font-size:12.0pt;font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;;Times New Roman&quot;;">进行排序的例子，实现时应该使用</span><span style="font-size:12.0pt; font-family:&quot;Times New Roman&quot;;">2</span><span style="font-size: 12pt; font-family: SimSun;">的指数为基数，从而避免除法和取模而采用位运算来获取较快的处理速度。<br />以下基数排序使用256个队列，对int类型的序列从小到大排序，但是还是比快排慢一些，其实用多少队列都比不上快排快。即使不用动态队列，都用静态队列，还是比快排慢。根本原因在于这种基数排序的思想跟现代CPU架构背道而驰，非常的不CPU cache friendly.从一个队列换到另一队列，然后再换回来，这种换来换去的机制导致CPU cache line不停的被重新填充，毕竟内存的延迟和访问速度比CPU cache要慢的多，大部分时间都耗费在这里。结果这种看上去很理想的所谓的O(n)算法，只能徒有虚名。相信这些是那些纯搞理论的算法专家和数学家永远都想不明白的！其实还不止基数排序如此，类似行为的计数排序和桶排序也快不起来，尽管它们的时间复杂度都是一色的O(n)。<br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">queue</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;use&nbsp;standard&nbsp;queue<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;non-portable&nbsp;implementation&nbsp;for&nbsp;LSD&nbsp;radix&nbsp;sort,&nbsp;for&nbsp;type&nbsp;int,&nbsp;32&nbsp;bit&nbsp;system</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;ForwardIterator</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;radix_sort(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last)<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;R:&nbsp;radix,&nbsp;K:&nbsp;k&nbsp;base,&nbsp;M:&nbsp;mask,&nbsp;B:&nbsp;?&nbsp;bit&nbsp;system</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;unsigned&nbsp;R&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">,&nbsp;K&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;R,&nbsp;M&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;K&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;B&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">32</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;std::queue</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;q[K];</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(unsigned&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;B;&nbsp;i&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;R)<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(ForwardIterator&nbsp;dit&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;&nbsp;dit&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">dit)<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;q[(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dit&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;i)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;M].push(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dit);<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;cit&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(unsigned&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;K;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">j)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">q[j].empty())<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">cit</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;q[j].front();<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q[j].pop();<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">}</span></div></div><img src ="http://www.cppblog.com/Chipset/aggbug/153549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:31 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>希尔排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153548.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:16:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153548.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153548.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153548.html</trackback:ping><description><![CDATA[<div>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">希尔排序，以其发明者</span>Donald Shell<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的名字来命名，是最早突破时间复杂度屏障</span>O(n<sup>2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的算法之一。希尔排序是直接插入排序的变种，它不是一种稳定的排序算法。希尔排序的原理是首先比较远距离的元素，然后递减比较距离，最终比较相邻元素。由于采用这种比较方式来排序，希尔排序有时候也被称为递减增量排序。</span> </p>  <p style="line-height: 150%;"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">增量序列的不同将直接影响希尔排序的速度，因此，不方便给出希尔排序理论上的时间复杂度。</span> Hibbard<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">采用的增量序列为：</span>1, 3, 7, ..., 2k<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">&#8211;</span> 1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span>(k = 1, 2, ...)<span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">，最坏情况下的时间复杂度为</span>O(n<sup>3/2</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span>Sedgewick <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">建议了几种增量序列，最坏情况下的时间复杂度为</span>O(n<sup>4/3</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，平均时间复杂度</span>O(n<sup>7/6</sup>)<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span>Empirical<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">研究发现它们的实际性能要比</span>Hibbard<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的增量序列好一些，其中最好的是</span>1, 5, 19, 41, 109, . . .<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，也就是说增量值要么为</span>9*4<sup>i</sup>- 9 *2<sup>i</sup> + 1 <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">要么为</span>4<sup>i</sup> - 3 *2<sup>i</sup> + 1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">，</span>(i = 0, 1, 2, ...)<span style="font-family: SimSun;">。希尔排序的空间复杂度依赖于具体实现。</span></p>  <p style="line-height:150%"><span style="font-family: SimSun;Times New Roman&quot;;Times New Roman&quot;">以随机整数序列为例，采用</span>Hibbard <span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">增量序列的希尔排序过程如下表。</span></p>  <table style="margin-left: 5.4pt; border-collapse: collapse; border: medium none;" border="1" cellpadding="0" cellspacing="0">  <tbody><tr style="height:7.6pt">   <td style="width:4.25in;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:7.6pt" valign="top" width="408">   <p>78&nbsp;17&nbsp;98&nbsp;91&nbsp;45&nbsp;95&nbsp;96&nbsp;95&nbsp;74&nbsp;14&nbsp;10&nbsp;79&nbsp;70&nbsp;19&nbsp;30&nbsp;66</p>   </td>   <td style="width:1.75in;border-top:solid windowtext 1.0pt;   border-left:none;border-bottom:solid windowtext 1.0pt;border-right:none;   padding:0in 5.4pt 0in 5.4pt;height:7.6pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">待排序序列</span></p>   </td>  </tr>  <tr style="height:13.9pt">   <td style="width:4.25in;border:none;padding:0in 5.4pt 0in 5.4pt;height:13.9pt" valign="top" width="408">   <p>78 &nbsp;17&nbsp;<em>14&nbsp;10&nbsp;45&nbsp;70&nbsp;19&nbsp;30&nbsp;66</em>&nbsp;<strong>98&nbsp;91&nbsp;</strong>79&nbsp;<strong>95&nbsp;96&nbsp;95&nbsp;74</strong></p>   </td>   <td style="width:1.75in;border:none;padding:0in 5.4pt 0in 5.4pt;height:13.9pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">增量为</span>7<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的排序结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:4.25in;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="408">   <p>78&nbsp;<em>10</em>&nbsp;14&nbsp;<strong>17</strong>&nbsp;<em>19&nbsp;30</em>&nbsp;<strong>45&nbsp;70</strong>&nbsp;66&nbsp;<em>74</em>&nbsp;91&nbsp;79&nbsp;95&nbsp;96&nbsp;95&nbsp;<strong>98</strong></p>   </td>   <td style="width:1.75in;border:none;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">增量为</span>2<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的排序结果</span></p>   </td>  </tr>  <tr style="height:3.5pt">   <td style="width:4.25in;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="408">   <p>10&nbsp;14&nbsp;17&nbsp;19&nbsp;30&nbsp;45&nbsp;66&nbsp;70&nbsp;74&nbsp;78&nbsp;79&nbsp;91&nbsp;95&nbsp;95&nbsp;96&nbsp;98</p>   </td>   <td style="width:1.75in;border:none;border-bottom:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;   height:3.5pt" valign="top" width="168">   <p><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">增量为</span>1<span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;">的排序结果</span></p>   </td>  </tr> </tbody></table>  </div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;T,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;shell_linear_insert(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;incr,&nbsp;T&nbsp;value,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(;&nbsp;first&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;last;&nbsp;first&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;incr)<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(value,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;incr)))<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;incr);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;value;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;for&nbsp;Hibbard&nbsp;sequence：&nbsp;1,&nbsp;3,&nbsp;7,&nbsp;15,&nbsp;31,&nbsp;63,&nbsp;127,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;worst&nbsp;cast&nbsp;time&nbsp;complexity&nbsp;O(n^(3/2))</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;shell_sort_H(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;incr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;((last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first)&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;incr&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;incr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(incr&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomIterator&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(incr&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_linear_insert(i,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;incr,&nbsp;incr,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i,&nbsp;cmp);<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;final_insertion_sort(first,&nbsp;last,&nbsp;cmp);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;last&nbsp;incremental&nbsp;value&nbsp;must&nbsp;be&nbsp;1</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;for&nbsp;Sedgewick&nbsp;and&nbsp;Empirical&nbsp;sequence：&nbsp;1,&nbsp;5,&nbsp;19,&nbsp;41,&nbsp;109,&nbsp;209,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;average&nbsp;time&nbsp;complexity&nbsp;O(n^(7/6)),&nbsp;worst&nbsp;case&nbsp;O(n^(4/3))</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;RandomIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;shell_sort_S(RandomIterator&nbsp;first,&nbsp;RandomIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;static_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(last&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;first);<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;long&nbsp;arr[28];<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;for(long&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;14;&nbsp;++i)<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;arr[i*2]&nbsp;=&nbsp;9*((1&lt;&lt;(2*i))&nbsp;-&nbsp;(1&lt;&lt;i))&nbsp;+&nbsp;1;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;arr[i*2&nbsp;+&nbsp;1]&nbsp;=&nbsp;((1&lt;&lt;(2*(i+2)))&nbsp;-&nbsp;3*(1&lt;&lt;(i+2)))&nbsp;+&nbsp;1;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;}</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;arr[</span><span style="color: #000000; ">28</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">19</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">41</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">109</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">209</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">505</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">929</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2161</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3905</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">8929</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">16001</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">36289</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">64769</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">146305</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">260609</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">587521</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1045505</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2354689</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4188161</span><span style="color: #000000; ">,&nbsp;&nbsp;</span><span style="color: #000000; ">9427969</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">16764929</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">37730305</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">67084289</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">150958081</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">268386305</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">603906049</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1073643521</span><span style="color: #000000; ">&nbsp;};<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">27</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;i;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;arr[i])<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(RandomIterator&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(arr[i]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;it&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;last;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">it)<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_linear_insert(it,&nbsp;first&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;arr[i],&nbsp;arr[i],&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it,&nbsp;cmp);<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;final_insertion_sort(first,&nbsp;last,&nbsp;cmp);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;last&nbsp;incremental&nbsp;value&nbsp;must&nbsp;be&nbsp;1</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">}</span></div><div><span style="font-family:SimSun;Times New Roman&quot;;Times New Roman&quot;"><br />这里介绍的希尔排序比堆排序的速度要快一些。<br /></span></div><img src ="http://www.cppblog.com/Chipset/aggbug/153548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:16 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153546.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153546.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153546.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153546.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153546.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153546.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我觉得在一般场合，单线程下快速排序是最快的，尽管它的时间复杂度为O(nlogn)，它甚至比时间复杂度为O(n)的基数排序、桶排序和计数排序都快一些。如果对字符窜排序，即使快排的仅仅是字符窜的指针(避免拷贝字符窜)，burst sort还是比快速排序快一些。快速排序的版本很多，常见的有C库函数qsort，C++STL中的sort(多个版本)，还是大学书上的臃肿快速排序的实现。这里介绍SGI STL版...&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2011/08/16/153546.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/153546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 13:05 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蜗牛排序--我见过的最慢的排序</title><link>http://www.cppblog.com/Chipset/archive/2011/08/16/153543.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 16 Aug 2011 04:35:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/08/16/153543.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/153543.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/08/16/153543.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/153543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/153543.html</trackback:ping><description><![CDATA[鄙人目光短浅，以为见到的这个时间复杂度为O(n!)的排序是最慢的。如果不是，请举出更慢的例子:)<br /><br />原理是枚举所有排列组合，直到找到一个合适的有序序列，取名蜗牛排序。<br /><br />使用模板来实现。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;greater<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;x,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;y)&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;x;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;less<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;x,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;y)&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;{&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;x&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;y;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">inline&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;swap(T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;x,&nbsp;T</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;y)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;T&nbsp;tmp(x);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;y;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;tmp;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;reverse&nbsp;a&nbsp;sequence&nbsp;in&nbsp;the&nbsp;range&nbsp;[first,&nbsp;last)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;BidirectionalIter</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;reverse(BidirectionalIter&nbsp;first,&nbsp;BidirectionalIter&nbsp;last)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">last)<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">first</span><span style="color: #000000; ">++</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">last);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">31</span><span style="color: #008000; "> // find the next possible permutation<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;BidirectionalIter,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">bool</span><span style="color: #000000; ">&nbsp;next_permutation(BidirectionalIter&nbsp;first,&nbsp;BidirectionalIter&nbsp;last,<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(first&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;BidirectionalIter&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;first;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;last)<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last;<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">i;<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(;;)<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;BidirectionalIter&nbsp;ii&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">i;<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ii))<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BidirectionalIter&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;last;<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">cmp(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i,&nbsp;</span><span style="color: #000000; ">*--</span><span style="color: #000000; ">j));<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">i,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">j);<br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reverse(ii,&nbsp;last);<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;first)<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reverse(first,&nbsp;last);<br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">template&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;BidirectionalIterator,&nbsp;typename&nbsp;Compare</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;snail_sort(BidirectionalIterator&nbsp;first,&nbsp;BidirectionalIterator&nbsp;last,&nbsp;Compare&nbsp;cmp)<br /></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(next_permutation(first,&nbsp;last,&nbsp;cmp));<br /></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;SZ&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">12</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;arr[SZ]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">9</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;};<br /></span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;snail_sort(arr,&nbsp;arr&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;SZ,&nbsp;greater</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">());<br /></span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;SZ;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;arr[i]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><img src ="http://www.cppblog.com/Chipset/aggbug/153543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-08-16 12:35 <a href="http://www.cppblog.com/Chipset/archive/2011/08/16/153543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见材料的导热率</title><link>http://www.cppblog.com/Chipset/archive/2011/05/29/147640.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Sun, 29 May 2011 12:40:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/05/29/147640.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/147640.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/05/29/147640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/147640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/147640.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 部分常见物质导热率          材质         导热率 (W&#183;m&#8722;1&#183;K&#8722;1)          测试温度   (K)          293K时的电导率 (&#937;&#8722;1&#183;m&#8722;1)          备注             丙烯酸酯玻璃 (普列克斯玻璃 V045i)         0.17-0....&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2011/05/29/147640.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/147640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-05-29 20:40 <a href="http://www.cppblog.com/Chipset/archive/2011/05/29/147640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构师已死(转贴)</title><link>http://www.cppblog.com/Chipset/archive/2011/02/01/139658.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Tue, 01 Feb 2011 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2011/02/01/139658.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/139658.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2011/02/01/139658.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/139658.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/139658.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]--><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
<p class="content">2006<span style="font-family: simsun;" lang="ZH-CN">年的职场出奇的冷清，相比前几年，简历的数量和质量都大为不如，很难得找到三年工作经验以上的人，有一个</span><span lang="ZH-CN"> </span><span style="font-family: simsun;" lang="ZH-CN">不是特别笨，就是特别怪。就是么，干得好谁没事换工作啊！</span>Simon<span style="font-family: simsun;" lang="ZH-CN">是一家外企软件公司的总经理，最近给这个问题愁坏了。项目一个接一个的接下来，人手越</span><span lang="ZH-CN"> </span><span style="font-family: simsun;" lang="ZH-CN">来越紧张。虽然</span>Simon<span style="font-family: simsun;" lang="ZH-CN">是个极限编程的粉丝，但也不得不批准了一份又一份的加班申请。</span>HR<span style="font-family: simsun;" lang="ZH-CN">经理把这个问题归结到房价上，他的妙论是</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">怕失业了还不上房</span><span lang="ZH-CN"> </span><span style="font-family: simsun;" lang="ZH-CN">款，不敢跳槽</span>&#8221;<span style="font-family: simsun;" lang="ZH-CN">。</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">这天，</span>K<span style="font-family: simsun;" lang="ZH-CN">项目组长</span>Allen<span style="font-family: simsun;" lang="ZH-CN">终于忍不住了，带了一个只有一年工作经验的小伙子要</span>Simon<span style="font-family: simsun;" lang="ZH-CN">面试，</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">很聪明！经验少了点。</span>&#8221;</p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">皱了皱眉毛，说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">你不知道这个职位最低要求是三年工作经验吗？</span>&#8221;</p>
<p class="content">Allen<span style="font-family: simsun;" lang="ZH-CN">说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">这已经是三个月里通过技术考试中最好的一个了，老大，试试吧。</span>&#8221;Allen<span style="font-family: simsun;" lang="ZH-CN">是</span>Simon<span style="font-family: simsun;" lang="ZH-CN">多年的哥们，比较随便。</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">抵到面子上来，</span>Simon<span style="font-family: simsun;" lang="ZH-CN">只好让</span>Allen<span style="font-family: simsun;" lang="ZH-CN">把小伙子带进来。</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">的面试通常是三步曲：</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">问题一：你能说说毕业后的主要工作经历吗？</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">问题二：再说说你在公司的地位？</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">问题三：你的发展目标是什么？等回答后，比如说架构师，他就跟着问：想象一下你当架构师的一天，说给我听听？</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子回答第一问题很快很清楚，一年工作当然没什么东西。</span>Simon<span style="font-family: simsun;" lang="ZH-CN">觉得小伙子挺聪明。所以在小伙子回答了第二个问题后，问了一个发散性的问题：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">你刚才说你在公司里处于中等水平，那比你差的人为什么会比你差呢？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">这个问题是个陷阱。</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子冒冒失失回答说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">我觉得他们每天工作是为工作而工作，工作没有责任感。</span>&#8221;</p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">点点头说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">是吗？那真是糟糕的员工。那你刚好比糟糕的员工好一点了？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子的脸一下子红了，</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">我不是这个意思</span>&#8230;&#8230;&#8221;</p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">好了，那你说说比你好的人为什么比你强？</span>&#8221;</p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">我觉得他非常努力，工作很多年了还在学习各种构架，水平很高。</span>&#8221;<span style="font-family: simsun;" lang="ZH-CN">于是</span>Simon<span style="font-family: simsun;" lang="ZH-CN">就问那最后一个问题。果然，小伙子回答的是要成为架构师。大概</span>70<span style="font-family: simsun;" lang="ZH-CN">％的人想成为架构师。但是架构师是什么呢？</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">问道：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">那你为什么要成为架构师呢？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子一愣，大概还没有人这么置疑过他。</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">年纪大了，不能老写程序吧。</span>&#8221;<span style="font-family: simsun;" lang="ZH-CN">这个回答，让</span>Simon<span style="font-family: simsun;" lang="ZH-CN">想起关于他对什么是老的定义：当你希望做年轻人做的事情时，你就还年轻；如果你希望做老年人做的事情，你就老了。这和你出生了多长时间是没有关系的。</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">接着问：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">好吧，那你说说你成为架构师以后，每天都会做什么？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">我还没想过，不过，我想应该主要是需求分析，设计构架吧</span>&#8230;&#8230;&#8221;<span style="font-family: simsun;" lang="ZH-CN">这大概是现在年轻人的通病，年轻人很容易追逐一些自己也不清楚的目标。</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">问：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">那设计构架具体都做些什么呢？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子这次的回答是：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">比如，选择程序框架，决定用</span>Spring<span style="font-family: simsun;" lang="ZH-CN">或</span>Struts<span style="font-family: simsun;" lang="ZH-CN">等等。</span>&#8221;</p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">哦，那我问你，你怎么说服别人是用</span>Spring<span style="font-family: simsun;" lang="ZH-CN">还是</span>Struts<span style="font-family: simsun;" lang="ZH-CN">呢？</span>&#8221;</p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">如果我有经验，我会知道哪个更好</span>&#8230;&#8230;&#8221;</p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">是吗，但关于</span>Spring<span style="font-family: simsun;" lang="ZH-CN">或</span>Struts<span style="font-family: simsun;" lang="ZH-CN">的知识任谁都可以很容易得到。如果别人不同意你的建议，你怎么说服他？如果同意你的建议，那你不过是作出了和别人一样的认识，别人又凭什么认可你呢？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子没想过架构师日子里还有一个说服人的工作，说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">我是架构师，我应该有权力做决定吧？</span>&#8221;</p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">想起权力的三种层次，第一层，任命；第二层，专业；第三层，品德。</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">问：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">如果在一个成熟的软件企业里没有你所想象的架构师呢？或者说，架构师这种职业已经死亡或消失了呢？你会怎么定位你的职业？</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子显得很震惊。</span></p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">画了一个系统构架，然后又给小伙子看了一段代码。</span></p>
<p class="content">&#8220;<span style="font-family: simsun;" lang="ZH-CN">那一个更难懂？</span>&#8221;Simon<span style="font-family: simsun;" lang="ZH-CN">问。</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">小伙子指着代码说：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">代码难懂。</span>&#8221;</p>
<p class="content">Simon<span style="font-family: simsun;" lang="ZH-CN">的解释是：</span>&#8220;<span style="font-family: simsun;" lang="ZH-CN">这就是为什么实际上所谓的架构师不存在的原因。一个更简单的东西怎么会更有价值呢？每个人都能够画出这种构架图，但不是每个人都能写出好的代码。</span>&#8221;</p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">送走了小伙子，</span>Simon<span style="font-family: simsun;" lang="ZH-CN">有点难受。他有点喜欢这个小伙子，但是，这又是一个被愚蠢的教育和误人子弟的技术杂志污染的家伙。</span>Simon<span style="font-family: simsun;" lang="ZH-CN">在自己的笔记本中加了一句话：中国程序员最愚蠢的认识之三：我想当架构师。前面两个赫然是：</span></p>
<p class="content">35<span style="font-family: simsun;" lang="ZH-CN">岁后写不动程序了；</span></p>
<p class="content"><span style="font-family: simsun;" lang="ZH-CN">我只要做</span>Java<span style="font-family: simsun;" lang="ZH-CN">（</span>C<span style="font-family: simsun;" lang="ZH-CN">＋＋）；</span></p>
<p class="MsoNormal">&nbsp;</p><img src ="http://www.cppblog.com/Chipset/aggbug/139658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2011-02-01 08:58 <a href="http://www.cppblog.com/Chipset/archive/2011/02/01/139658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/C#/F#/Java/JS/Lua/Python/Ruby渲染速度比试</title><link>http://www.cppblog.com/Chipset/archive/2010/12/02/135260.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Thu, 02 Dec 2010 05:23:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2010/12/02/135260.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/135260.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2010/12/02/135260.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/135260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/135260.html</trackback:ping><description><![CDATA[之前常听说C#和Java与C++的速度接近，更有甚者说很多情况下他们都比C++快，而且举出一大堆的范例(多是些IO操作，测量误差超级大，因此很难令人信服)，于是听到很多人出来圆场，说对于语言内建类型(整形、浮点型等)，编译成二进制应该相差不大，这似乎有些道理，但我仍然有些怀疑。<br><br>还曾经听不少人鼓吹过脚本，说脚本程序比C++程序慢不了多少，有人甚至给10%，对此我不加评论了，看看这里的测试结果就一目了然。<br><br>下面有个浮点密集型的计算程序，没有使用blitz++和MTL，很符合一般性应用，如果用上他们那就不好说怎么样，因为主要是和Fortran比科学计算速度时才用。已经有人编码测试了。<br>只讲速度，如果再比内存，其他几种语言就没有必要比下去了。<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"></span></div>
<br>不同语言版本的代码到原作者提供的地址去下载：http://files.cnblogs.com/miloyip/smallpt20100623.zip<br>下面是测试用的系统配置：<br><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><!--[if !mso]><object
classid="clsid:38481807-ca0e-42d2-bf39-b33af135cc4d" id="ieooui"></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<h2><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">测试配置</span><span style="font-size: 10pt;"></span></h2>
<ul type="disc">
    <li class="MsoNormal"><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">硬件</span><span style="font-size: 10pt;">: Intel Core i7 920@2.67Ghz(4 core, HyperThread), 12GB RAM</span></li>
    <li class="MsoNormal"><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">操作系统</span><span style="font-size: 10pt;">: Microsoft Windows 7 64-bit</span></li>
</ul>
<table class="MsoNormalTable" style="width: 100%;" border="1" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">测试名称</span><span style="font-size: 10pt;"> </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">编译器</span><span style="font-size: 10pt;">/</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">解译器</span><span style="font-size: 10pt;"> </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">编译</span><span style="font-size: 10pt;">/</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">运行选项</span><span style="font-size: 10pt;"> </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">VC++ </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C++ 2008 (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Ob2 /Oi /Ot /GL /FD
            /MD /GS- /Gy /arch:SSE /fp:fast </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">VC++_OpenMP </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C++ 2008 (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Ob2 /Oi /Ot /GL /FD
            /MD /GS- /Gy /arch:SSE /fp:fast /openmp </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">IC++ </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Intel C++ Compiler (32-bit)
            </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Og /Ob2 /Oi /Ot /Qipo
            /GA /MD /GS- /Gy /arch:SSE2 /fp:fast /Zi /QxHost </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">IC++_OpenMP </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Intel C++ Compiler (32-bit)
            </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Og /Ob2 /Oi /Ot /Qipo
            /GA /MD /GS- /Gy /arch:SSE2 /fp:fast /Zi /QxHost /Qopenmp </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC 4.3.4
            in Cygwin (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">-O3 -march=native
            -ffast-math </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC_OpenMP </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC 4.3.4
            in Cygwin (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">-O3 -march=native
            -ffast-math -fopenmp </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">C++/CLI </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C++ 2008 (32-bit),
            .Net Framework 3.5 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Ob2 /Oi /Ot /GL /FD
            /MD /GS- /fp:fast /Zi /clr /TP </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">C++/CLI_OpenMP </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C++ 2008 (32-bit),
            .Net Framework 3.5 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">/Ox /Ob2 /Oi /Ot /GL /FD
            /MD /GS- /fp:fast /Zi /clr /TP /openmp </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">C# </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C# 2008 (32-bit),
            .Net Framework 3.5 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">*C#_outref </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Visual C# 2008 (32-bit),
            .Net Framework 3.5 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">F# </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p><span style="font-size: 10pt;">F# 2.0 (32-bit), .Net Framework 3.5 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Java </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Java SE 1.6.0_17
            </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal" style="text-align: justify;"><span style="font-size: 10pt;">-server </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">JsChrome </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Chrome 5.0.375.86 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">JsFirefox </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Firefox 3.6 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">LuaJIT </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">LuaJIT 2.0.0-beta4
            (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Lua </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">LuaJIT (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">-joff </span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Python </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Python 3.1.2
            (32-bit) </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">*IronPython </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">IronPython 2.6 for .Net 4 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">*Jython </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Jython 2.5.1
            </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
        <tr>
            <td style="width: 20%; padding: 2.25pt;" width="20%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Ruby </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">Ruby 1.9.1p378 </span></p>
            </td>
            <td style="width: 40%; padding: 2.25pt;" width="40%">
            <p class="MsoNormal"><span style="font-size: 10pt;">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">渲染的解像度为</span><span style="font-size: 10pt;">256x256</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，每象素作</span><span style="font-size: 10pt;">100</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">次采样。</span><span style="font-size: 10pt;"></span></p>
<!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<h2><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">结果及分析</span><span style="font-size: 10pt;"></span></h2>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">下表中预设的相对时间以最快的单线程测试</span><span style="font-size: 10pt;">(IC++)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">作基准，用鼠标按列可改变基准。由于</span><span style="font-size: 10pt;">Ruby</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">运行时间太长，只每象素作</span><span style="font-size: 10pt;">4</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">次采样，把时间乘上</span><span style="font-size: 10pt;">25</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。另</span><span style="font-size: 10pt;" lang="ZH-CN"> </span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">外，因为各测试的渲染时间相差很远，所以用了两个棒形图去显示数据，分别显示时间少于</span><span style="font-size: 10pt;">4000</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">秒和少于</span><span style="font-size: 10pt;">60</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">秒的测试</span><span style="font-size: 10pt;">(Ruby</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">是</span><span style="font-size: 10pt;">4000</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">秒以外，不予显</span><span style="font-size: 10pt;" lang="ZH-CN"> </span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">示</span><span style="font-size: 10pt;">)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。</span><span style="font-size: 10pt;"> </span></p>
<table class="MsoNormalTable" style="width: 300pt;" border="0" cellpadding="0" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Test</span><span class="google-visualization-table-sortind"><span style="font-size: 10pt; font-family: &quot;ms mincho&quot;;" lang="ZH-CN">&#8195;</span></span><span style="font-size: 10pt;"></span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Time(sec)</span><span class="google-visualization-table-sortind"><span style="font-size: 10pt; font-family: &quot;ms mincho&quot;;" lang="ZH-CN">&#8195;</span></span><span style="font-size: 10pt;"></span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Relative time</span><span class="google-visualization-table-sortind"><span style="font-size: 10pt; font-family: &quot;ms mincho&quot;;" lang="ZH-CN">&#8195;</span></span><span style="font-size: 10pt;"></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">IC++_OpenMP</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">2.861</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">0.19x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">VC++_OpenMP</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3.140</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">0.21x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC_OpenMP</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3.359</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">0.23x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">C++/CLI_OpenMP</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">5.147</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">0.35x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">IC++</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">14.761</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">1.00x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">VC++</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">17.632</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">1.19x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">GCC</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">19.500</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">1.32x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">C++/CLI</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">27.634</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">1.87x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Java</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">30.527</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">2.07x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">C#_outref</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">44.220</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3.00x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">F#</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">47.172</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3.20x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">C#</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">48.194</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3.26x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">JsChrome</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">237.880</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">16.12x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">LuaJIT</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">829.777</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">56.21x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Lua</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">1,227.656</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">83.17x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">IronPython</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">2,921.573</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">197.93x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">JsFirefox</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3,588.778</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">243.13x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Python</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">3,920.556</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">265.60x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Jython</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">6,211.550</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">420.81x</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">Ruby</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">77,859.653</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p class="MsoNormal"><span style="font-size: 10pt;">5,274.69x</span></p>
            </td>
        </tr>
    </tbody>
</table>
<h3><span style="font-size: 10pt;">C++/.Net/Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">组别</span><span style="font-size: 10pt;"></span></h3>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">静态语言和动态语言在此测试下的性能不在同一数量级。先比较静态语言。</span><span style="font-size: 10pt;"></span></p>
<p><span style="font-size: 10pt;">C++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">和</span><span style="font-size: 10pt;">.Net</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的测试结果和上一篇博文相若，而</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">和</span><span style="font-size: 10pt;">F#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">无显著区别。但是，</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">虽然同样产生</span><span style="font-size: 10pt;">IL</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，于括管的</span><span style="font-size: 10pt;">.Net</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">平台上执行，其渲染时间</span><span style="font-size: 10pt;" lang="ZH-CN">
</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">却只是</span><span style="font-size: 10pt;">C#/F#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">55%</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">左右。为什么呢？使用</span><span style="font-size: 10pt;">ildasm</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">去反汇编</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">和</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的可执行文件后，可以发现，程序的热点函数</span><span style="font-size: 10pt;">
Sphere.Intersect()</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">在两个版本中，</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本的代码大小</span><span style="font-size: 10pt;">(code size)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">为</span><span style="font-size: 10pt;">201</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">字节，</span><span style="font-size: 10pt;"> C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">则为</span><span style="font-size: 10pt;">125</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">字节！</span><span style="font-size: 10pt;"> C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本在编译时，已把函数内所有</span><span style="font-size: 10pt;">Vec</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">类的方法调用全部内联，而</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本则使用</span><span style="font-size: 10pt;">callvirt</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">调用</span><span style="font-size: 10pt;">Vec</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的方法。估计</span><span style="font-size: 10pt;">JIT</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">没有把这函数进</span><span style="font-size: 10pt;" lang="ZH-CN"> </span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">行内联，做成这个性能差异。另外，</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本使用了值类型，并使用指针</span><span style="font-size: 10pt;">(</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">代码中为引用</span><span style="font-size: 10pt;">)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">托管代码</span><span style="font-size: 10pt;">(C++/CLI)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的渲染时间，仅为原生非括管代码</span><span style="font-size: 10pt;">(IC++)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">1.91</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">倍，个人觉得</span><span style="font-size: 10pt;">.Net</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">JIT</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">已经非常不错。</span><span style="font-size: 10pt;"> </span></p>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">另一方面，</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的性能表现非常突出，只比</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">稍慢一点，</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本的渲染时间为</span><span style="font-size: 10pt;">C#/F#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">65%</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">左右。以前一直认为，</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">不少设计会使其性能高于</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，例如</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的方法预设为非虚，</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">则预设为虚；又例如</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">支持</span><span style="font-size: 10pt;">struct</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">作值类型</span><span style="font-size: 10pt;">(value type)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，</span><span style="font-size: 10pt;">Java</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">则只有</span><span style="font-size: 10pt;">class</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">引用类型</span><span style="font-size: 10pt;">(reference type)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，后者必须使用</span><span style="font-size: 10pt;">GC</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。但是，这个测试显示，</span><span style="font-size: 10pt;">Java VM</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">应该在</span><span style="font-size: 10pt;">JIT</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">中做了大量优化，估计也应用了内联，才能使其性能逼近</span><span style="font-size: 10pt;">C++/CLI</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。</span><span style="font-size: 10pt;"> </span></p>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">纯</span><span style="font-size: 10pt;">C++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">方面，</span><span style="font-size: 10pt;">Intel C++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">编译器最快，</span><span style="font-size: 10pt;">Visual C++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">慢一点点</span><span style="font-size: 10pt;">(1.19x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，</span><span style="font-size: 10pt;">GCC</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">再慢一点点</span><span style="font-size: 10pt;">(1.32x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。这结果符合本人预期。</span><span style="font-size: 10pt;"> Intel C++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">OpenMP</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本和单线程比较，达</span><span style="font-size: 10pt;">5.16</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">加速比</span><span style="font-size: 10pt;">(speedup)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，对于</span><span style="font-size: 10pt;">4</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">核</span><span style="font-size: 10pt;">Hyper Threading</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">来说算是不错的结果。读者若有兴趣，也可以自行测试</span><span style="font-size: 10pt;">C# 4.0</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的并行新特性。</span><span style="font-size: 10pt;"> </span></p>
<h3><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">动态语言组别</span><span style="font-size: 10pt;"></span></h3>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">首先，要说一句，</span><span style="font-size: 10pt;">Google</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">太强了，难以想像</span><span style="font-size: 10pt;">JsChome</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的渲染时间仅是</span><span style="font-size: 10pt;">IC++</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">16.12</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">倍，</span><span style="font-size: 10pt;">C#</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">4.94</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">倍。</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN"></span><span style="font-size: 10pt;"> </span></p>
<p><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">以下比较各动态语言的相对时间，以</span><span style="font-size: 10pt;">JsChrome</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">为基准。</span><span style="font-size: 10pt;"> Chrome</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">V8 JavaScript</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">引擎</span><span style="font-size: 10pt;">(1.00x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">大幅抛离</span><span style="font-size: 10pt;">Firefox</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">SpiderMonkey</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">引擎</span><span style="font-size: 10pt;">(15.09x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">。而</span><span style="font-size: 10pt;">LuaJIT(3.49x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">和</span><span style="font-size: 10pt;">Lua(5.16x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">则排第二和第三名。</span><span style="font-size: 10pt;"> Lua</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">JIT</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">版本是没有</span><span style="font-size: 10pt;">JIT</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">68%</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，并没有想像中的快，但是也比</span><span style="font-size: 10pt;">Python(16.48x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">快得多。曾听说过</span><span style="font-size: 10pt;">Ruby</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">有效能问题，没想到问题竟然如此严重</span><span style="font-size: 10pt;">(327.31x)</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">，其渲染时间差不多是</span><span style="font-size: 10pt;">Python</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">的</span><span style="font-size: 10pt;">20</span><span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN">倍.</span><span style="font-size: 10pt;"> </span></p>
<span style="font-size: 10pt; font-family: simsun;" lang="ZH-CN"></span><span style="font-size: 10pt;"></span>
<br> <img src ="http://www.cppblog.com/Chipset/aggbug/135260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2010-12-02 13:23 <a href="http://www.cppblog.com/Chipset/archive/2010/12/02/135260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#, C++, Java性能对比</title><link>http://www.cppblog.com/Chipset/archive/2009/03/01/75266.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Sun, 01 Mar 2009 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2009/03/01/75266.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/75266.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2009/03/01/75266.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/75266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/75266.html</trackback:ping><description><![CDATA[<br>摘选自Onur&nbsp;Gumus的博客。<br><a  href="http://reverseblade.blogspot.com/2009/02/c-versus-c-versus-java-performance.html" target="_blank">http://reverseblade.blogspot.com/2009/02/c-versus-c-versus-java-performance.html</a><br><br>C#&nbsp;vs&nbsp;C++&nbsp;vs&nbsp;Java性能对比<br><br>C#,&nbsp;Java
和C++对比性能常常是引发争议的一个话题。那些不熟悉JIT的人常常声称JIT上运行的任何程序跟C++比速度都不行。而那些使用Java和C#的人则
常常声称性能差别甚小，几乎可以忽略不计。这里有一个测试对比结果图，来自freenode&nbsp;IRC服务器，不知道谁测试的，但是结果似乎很真实。&nbsp;<br><br>对于我来说，因为性能原因选择C++似乎理由不足。记住：工程师比服务器要昂贵的多！<br><img alt=""  src="http://www.cppblog.com/images/cppblog_com/chipset/benchmarksJan2009Final.gif"><br><br>部分其他人的评论：<br><br>单线程测试的，多线程如何？内存耗费多少？测试程序数据使用的语言内建类型(比如int)还是自定义类型，如果语言本身内建的类型那编译成二进制测试时间消耗差别不会多大是正常的。<br>PHP没有针对Windows系统优化，因此速度肯定上不去。<br>在Windows上测试Java是否运行在虚拟机上？默认情况可并非如此(跟Linux可不同)！再者，测试结果耗费时间太短误差相对可能很大，很难说明实际情形。<br><br>更多评论...<img src ="http://www.cppblog.com/Chipset/aggbug/75266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2009-03-01 22:22 <a href="http://www.cppblog.com/Chipset/archive/2009/03/01/75266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Why Java Will Always Be Slower Than C++?</title><link>http://www.cppblog.com/Chipset/archive/2008/12/18/69739.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Thu, 18 Dec 2008 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2008/12/18/69739.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/69739.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2008/12/18/69739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/69739.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/69739.html</trackback:ping><description><![CDATA[<h1 style="font-weight: normal;"></h1>
<span style="font-size: 10pt;">
<h1 style="font-weight: normal;">Why Java Will Always Be Slower than C++</h1>
<h1 style="font-weight: normal;"><em>by Dejan Jelovic</em></h1>
<h1 style="font-weight: normal;">&nbsp;<em><font size="4">"Java is high performance. By high performance we mean
adequate. By adequate we mean slow." </font></em><font size="4">- </font> <a href="http://www.mrbunny.com/">
<font size="4">Mr. Bunny</font></a></h1>
</span>
<h1 style="font-weight: normal;"><a href="http://www.mrbunny.com/"><font size="4"></font></a></h1>
<p class="separatefromnext"><em></em></p>
<span style="font-size: 10pt;">
<p class="separatefromnext"><em></em></p>
<span style="font-size: 12pt;">
</span>
<p><a href="http://www.mrbunny.com/"><font size="4"></font></a></p>
</span>
<p><a href="http://www.mrbunny.com/"><font size="4"></font></a></p>
&nbsp;&nbsp;&nbsp; 耍过Java程序，或者用Java码过程序的人都晓得，Java要比用C++写成的原生程序要慢。这是咱用Java时已经承认的事实。<br>　　不过，很多人想要说服我们说这只不过是暂时的，他们说Java从设计上来讲并不慢，相反，只是现在的JIT实现相对比较嫩，有很多能优化的地方JIT并没有优化到，拖了后腿。其实不然，不管JIT们多牛，Java永远要比C++慢。<br>　　<br>　　我想说...<br>　　宣扬Java不慢于C++的人往往是觉得，（语法）严格的语言，可以让编译有更大的优化空间。因此，除非你想做人肉编译器优化整个程序，否则通常都是编译器做得更好。<br>　　这是真的。在数值计算领域，Fortran仍然胜于C++，的确因为它更严格。不用担心指针瞎搅和，编译器可以更安心地优化。C++想打败Fortran的唯一办法，就是好好设计一个像Blitz++那样的库。<br><br>　　测试...<br>
Java可以跟得上C++的地方，就是基准测试。计算起第N个斐波纳契数，或者运行起Linpack，Java没理由不跟C++跑得一样快。当所有的计
算都放在一个类里，并且只使用基本的数据类型，比如说int或者double时，Java编译器的确能跟得上C++的脚步。<br><br>　　事实...<br>　　当开始在程序中使用对象的时候，Java就放松了潜在的优化。这一节会告诉你为什么。<br><br>　　1.&nbsp;所有的对象都是从堆里分配的。<br>　　Java从栈里分配的，就只有基本数据类型，如int，或者double，还有对象的引用。所有的对象都是从堆里分配的。<br>　　当有大量语义上是一回事的对象时，这不成问题。C++同样也是从堆上分配这些对象。但是，当有值语义不同的小对象时，这就是一个主要的性能杀手。<br>
什么是小对象？对我来说，就是迭代器们。在设计中，我用了很多迭代器。别人可能会用复数。3D程序员可能会矢量或者点类。处理时间序列的人可能会有时间
类。使用这些类的人，无一例外地讨厌把不费时间的栈上分配换成花费固定时间的堆上分配。假如把它放在一个循环里，就变成了O(n)对0了。如果再加一层循
环，没错，又变成O(n^2)对0了。<br><br>　　2.&nbsp;大量的转换。<br>　　得益于模板，好的C++程序员甚至可以写于完全没有转换的牛程序。不幸，Java没有模板，所以Java代码总是充满了转换。<br>　　对于性能，它们意味着什么？呃，在Java里所有的转换都是很费时的动态转换。多费时？想想你可能会怎么样实现转换的：<br>　　最快的方法就是，给每一个类赋值一个序号，然后用一个矩阵来描述任意两个类是否相关的。如果是的话，需要给指针加上多少的位移才能进行转换。这种方法的伪码看起来应该是这样的：<br>DestinationClass&nbsp;makeCast&nbsp;(Object&nbsp;o,&nbsp;Class&nbsp;destinationClass)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;sourceClass&nbsp;=&nbsp;o.getClass&nbsp;();&nbsp;//&nbsp;JIT&nbsp;compile-time<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sourceClassId&nbsp;=&nbsp;sourceClass.getId&nbsp;();&nbsp;//&nbsp;JIT&nbsp;compile-time<br><br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;destinationId&nbsp;=&nbsp;destinationClass.getId&nbsp;();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;offset&nbsp;=&nbsp;ourTable&nbsp;[sourceClassId][destinationClassId];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(offset&nbsp;!=&nbsp;ILLEGAL_OFFSET_VALUE)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&lt;object&nbsp;o&nbsp;adjusted&nbsp;for&nbsp;offset&gt;;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalCastException&nbsp;();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>好一堆代码。这只是一个简单的情景——用矩阵来表示类的关系浪费了一部分内存，没有哪个成熟的编译器会这样子做。他们会使用map或者遍历继承树，这样会变得更慢。<br><br>　　3.&nbsp;攀升的内存占用。<br>　　Java程序储存数据占用的内存大概是相当的C++程序的两倍。原因如下：<br>　　1.&nbsp;启用了垃圾收集的程序一般都比不使用垃圾收集的程序多花50%的内存。<br>　　2.&nbsp;本来C++里在栈上分配的对象，到了Java就在堆上分配了。<br>　　3.&nbsp;Java对象比较大，因为所有的对象都有一个虚表，还要加上对（线程）同步的原生支持。<br>大的内存映像让程序更大概率被放到磁盘的交换区去。没有什么比交换文件更慢的了。<br>　　4.&nbsp;缺少更细致的控制。<br>Java原来就是作为一种简单的语言来设计的。很多在C++里让程序员控制细节的特性在Java里都被一脚踢开了。<br>　　比如说，在C++里可以改进引用的位置(?)。或者一次申请和释放很多个对象。或者用指针耍一些小技巧，更快地访问成员。<br>　　5.&nbsp;没有高层次的优化。<br>　　程序员处理高层次的概念。而编译器处理剩下的低层次概念。对于程序员来说，一个叫Matrix的类就代表了比一个叫Vector的类更高层次的概念。而对于编译器来说，这些名字都是符号表的一个入口。他们只关心类里面有哪些函数，函数里面有哪些语句。<br>　　这样想一下，比如说要实现一个exp(double&nbsp;x,&nbsp;double&nbsp;y)函数，计算出x的y次幂。对于一个编译器，它能只看一下这个函数，然后指出，exp(exp(x,&nbsp;2),&nbsp;0.5)可以优化成x自己吗？当然不行。<br>　　编译器能做的优化只是语句层面的，而y是在编译器里面的。即使程序员知道两个函数是对称的，可以把它们都消去，或者函数的调用顺序只是相反的，除非编译器能只瞄一下语句，然后指出来，不然优化是不可能完成的。<br>　　所以，如果想要完成一个高水平的优化，必须存在某种方法，可以让程序员来告诉编译器优化的规则。<br><br>
没有哪个流行的程序语言/系统可以做到这点，至少已知的方法，比如微软承诺的智能语言，都不能。即便如此，在C++里可以用模板元编程来实现对高层次对
象的优化。临时消除，部分求值，对称函数调用的消去，和其它可以用模板实现的优化。当然，不是所有的高层次优化都可以这样做。并且实现这些东西相当麻烦。
但是大多数都可以完成，有人已经用这些技术实现了好些时髦的库。<br><br>　　不幸的是，Java没有任何元编程的特质，因此在Java中不会有这种高层次的优化。<br>　　所以...<br><br>　　由于存在这种语言特性，Java不可能达到C++这种速度。这相当程序上暗示了，对于要求高性能的软件和竞争激烈的COTS舞台上，使用Java不是一种明智的选择。但是因为它和缓的学习曲线，它的容错，和它庞大的标准库，所以适合开发中小型自用和定制软件。<br><br>　　附记...<br>　　1.&nbsp;有人向James&nbsp;Gosling（谁？google之...）提交了很多可以改进Java性能的语言特性。文本在这里。不幸的是，Java语言已经有四年没有改动过了，所以看起来这些提议似乎不会在一夜之间被实现。<br><br>　　2.&nbsp;最有可能往Java里加入泛型的是Generic&nbsp;Java。又很不幸的是，GJ只是通过在编译时把所有类型信息去掉来支持泛型。所以最后面执行环境看到的，仍然是缓慢的转换。<br><br>　　3.&nbsp;垃圾收集的FAQ包含了关于垃圾收集慢于定制分配器的信息（上面第四点）。<br><br>
4.&nbsp;这里是一篇宣称垃圾收集比栈分配的快的文章。但是它的要求是物理内存必须是程序实际需要的内存的七倍之多。还有，它描述的是一种stop-
and-copy（是不是那种执行到一半，然后停下来，把内存拷到另外一块内存，同时清除垃圾的那种方法？），而且还不是并发的。<br><br>　　反馈...<br>　　我收到很多关于这篇文章的反馈。附上一些典型的评论，还有我的回答：<br><br>　　&#8220;你还忘记了指出在Java里所有的方法都是虚方法，因为没有人会加上final关键字。&#8221;<br>　　事实上，不使用final关键字不是问题的关键所在，使用者才是。同时，虚函数也没有问题，但是却失去了优化机会。自从JIT们知道怎么样内联虚函数，这就变得不那么显著了。<br><br>　　JIT可以内联虚函数，所以Java可以比C++更快。<br>　　C++也可以使用JIT编译。不信的可以看看.NET的C++编译器。<br><br>　　到最后的时候，速度并不重要。电脑浪费了大部份时间在等待用户输入。<br>　　速度仍然很重要。我仍然在等我的笔记本启动起来，我在等我的编译器停下来，我还要等Word打开一个超长的文档。<br>　　我在一个金融公司工作。有时候我必须对一个很大的数据集进行模拟。速度在这种情况下都很重要。<br><br>　　有些JIT可以在栈上分配一些对象。<br>　　当然，一些。<br><br>　　你的转换代码看起来很丑。可以在类的继承层次上检查类。<br>　　首先，这样只比矩阵查找快一点点而已。<br>　　第二，这样只能查找类，类只占多少？低层次的细节往往是通过接口来实现的。<br><br>　　哈，那么我们都应该使用汇编？<br>　　不是的，我们都要使用对业务有用的语言。Java提供了庞大的标准库，让很多任务变得容易，因此Java是伟大的。它比其它所有的语言更容易移植（但并非100%可移植——不同的平台有不同问题）。它具有垃圾收集机制，简化了内存管理，同时也让某些构造如闭包可实现。<br>　　但是，同时，Java和所有的语言一样，也有瑕疵。在值语义的类型上缺少支持。它的同步并不是很有效率。它的标准库建立在异常检查之上，把实现拖进了接口。它的性能可以更好。它的数学库有些恼人的问题。诸如此类。<br><br>　　这些缺憾都是大问题吗？看你用它做什么。因此，在几种语言里，连同它的编译器以及可以选择的类库里选择对你的工程有利的一种。<br><br>原文见：http://www.jelovic.com/articles/why_java_is_slow.htm<br>[林杰杰翻译，不是我(Chipset)译，我仅仅是拷贝林杰杰的！]<br><br>  <img src ="http://www.cppblog.com/Chipset/aggbug/69739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2008-12-18 17:20 <a href="http://www.cppblog.com/Chipset/archive/2008/12/18/69739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的应用</title><link>http://www.cppblog.com/Chipset/archive/2008/12/17/69625.html</link><dc:creator>Chipset</dc:creator><author>Chipset</author><pubDate>Wed, 17 Dec 2008 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/Chipset/archive/2008/12/17/69625.html</guid><wfw:comment>http://www.cppblog.com/Chipset/comments/69625.html</wfw:comment><comments>http://www.cppblog.com/Chipset/archive/2008/12/17/69625.html#Feedback</comments><slash:comments>38</slash:comments><wfw:commentRss>http://www.cppblog.com/Chipset/comments/commentRss/69625.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Chipset/services/trackbacks/69625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 pt02falsefalsefalseMicrosoftInternetExplorer4/* Style Definitions */table.MsoNormalTable{mso-style-name:"Table Normal";mso-tstyle-rowband-size:0;mso-tsty...&nbsp;&nbsp;<a href='http://www.cppblog.com/Chipset/archive/2008/12/17/69625.html'>阅读全文</a><img src ="http://www.cppblog.com/Chipset/aggbug/69625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Chipset/" target="_blank">Chipset</a> 2008-12-17 09:34 <a href="http://www.cppblog.com/Chipset/archive/2008/12/17/69625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>