<div id="article_content" class="article_content csdn-tracking-statistics tracking-click" data-mod="popu_519" data-dsm="post"> <div class="htmledit_views"> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 注:此文章是从回收站里拉回来的,懒得排版,所以没有缩进,凑活看吧</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> sort是C++标准模板库(Standard Template Library,即STL)中最常用的算法。其包含在头文件<algorithm>中,</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 我们只能对“数组”元素进行排序。在C++中,有且仅有如下两种调用方法(JAVA中略有不同):</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> sort(first, last)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> sort(first, last, cmp)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 其中first是数组的首地址,last是数组最后一个元素地址的后一个位置。也就是说,这是一个前闭后开区间[first, last)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 而cmp是一个函数(不需要带括号和参数表)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 对于c++的基本数据类型(int, char, double, long long之类)以及string,因为已经定义了2个元素之间的大小比较,故不需要cmp函数</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 而对于人为的自定义类型(如struct结构体),必须要人工定义其大小,或者采用cmp函数,我们才能进行sort排序</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 特别说明,sort默认是升序排序,因此如果需要降序排序,也需要人为定义cmp函数。</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 下面看这段代码:</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> </p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 442px; top: 729px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#include<iostream> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include<algorithm> </span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> MAXN = 100 + 5; </span></span></li><li class=""><span>string a[MAXN]; </span></li><li class="alt"><span> </span></li><li class=""><span><span class="datatypes">int</span><span> main() </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> a[0] = <span class="string">"nanjing"</span><span>; </span></span></li><li class="alt"><span> a[1] = <span class="string">"suzhou"</span><span>; </span></span></li><li class=""><span> a[2] = <span class="string">"shanghai"</span><span>; </span></span></li><li class="alt"><span> a[3] = <span class="string">"beijing"</span><span>; </span></span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < 4; i++) cout << a[i] << endl; </span></span></li><li class="alt"><span> cout << endl; </span></li><li class=""><span> sort(a, a + 4); </span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < 4; i++) cout << a[i] << endl; </span></span></li><li class=""><span> <span class="keyword">return</span><span> 0; </span></span></li><li class="alt"><span>} </span></li></ol></div><pre class="cpp" name="code" style="display: none;">#include<iostream> #include<algorithm> using namespace std; const int MAXN = 100 + 5; string a[MAXN]; int main() { a[0] = "nanjing"; a[1] = "suzhou"; a[2] = "shanghai"; a[3] = "beijing"; for(int i = 0; i < 4; i++) cout << a[i] << endl; cout << endl; sort(a, a + 4); for(int i = 0; i < 4; i++) cout << a[i] << endl; return 0; } </pre><br><p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 运行结果:</p> <span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">nanjing</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">suzhou</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">shanghai</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">beijing</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">beijing</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">nanjing</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">shanghai</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">suzhou</span><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><br style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"><p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> string是c++中的对象,其源码是封装好的一个class类,已经定义好了大小(字典序)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 因此我们直接排序即可得到这4个字符串按字典序升序排列的结果。</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 下面我们不采用字典序,而采用另外排序方法——首先根据字符串的长度降序来排序。长度相同的情况,再按字典序升序排列(套用这个格式即可,小于返回真,否则返回假)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> bool cmp(string a, string b)<br> {<br><span style="margin:0px;padding:0px;white-space:pre;"></span>if(a.length() != b.length()) return a.length() > b.length();<br><span style="margin:0px;padding:0px;white-space:pre;"></span>else return a < b;<br> }<br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 调用sort(a, a + 4, cmp)运行结果:</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> shanghai<br> beijing<br> nanjing<br> suzhou<br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 那么如果我们不去使用cmp函数呢?这里介绍第二种常用的方法——c++中的操作符重载。只要重载了小于号,即可只需2个参数调用sort函数。<span style="margin:0px;padding:0px;font-size:24px;">读者记住这种格式即可</span></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 示例:平面直角坐标系中,所有的点按距离原点的欧拉距离从大到小排列。相同距离再按x升序排列。相同的x再按y升序排列</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 442px; top: 1997px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#include<iostream> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include<algorithm> </span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> MAXN = 100 + 5; </span></span></li><li class=""><span><span class="keyword">struct</span><span> Node </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> x; </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> y; </span></span></li><li class=""><span> Node(<span class="datatypes">int</span><span> a = 0, </span><span class="datatypes">int</span><span> b = 0){x = a; y = b;} </span></span></li><li class="alt"><span>}node[MAXN]; </span></li><li class=""><span> </span></li><li class="alt"><span><span class="datatypes">bool</span><span> operator < (Node a, Node b) </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> <span class="keyword">if</span><span>(a.x * a.x + a.y * a.y != b.x * b.x + b.y * b.y) </span></span></li><li class=""><span> <span class="keyword">return</span><span> a.x * a.x + a.y * a.y > b.x * b.x + b.y * b.y; </span></span></li><li class="alt"><span> <span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(a.x != b.x) </span></span></li><li class=""><span> <span class="keyword">return</span><span> a.x < b.x; </span></span></li><li class="alt"><span> <span class="keyword">else</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> a.y < b.y; </span></span></li><li class="alt"><span>} </span></li><li class=""><span> </span></li><li class="alt"><span><span class="datatypes">int</span><span> main() </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> node[0] = Node(1, 1); </span></li><li class=""><span> node[1] = Node(2, 3); </span></li><li class="alt"><span> node[2] = Node(-2, 3); </span></li><li class=""><span> node[3] = Node(2, -3); </span></li><li class="alt"><span> sort(node, node + 4); </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < 4; i++) </span></span></li><li class="alt"><span> cout << <span class="string">"("</span><span> << node[i].x << </span><span class="string">", "</span><span> << node[i].y << </span><span class="string">")"</span><span> << endl; </span></span></li><li class=""><span> <span class="keyword">return</span><span> 0; </span></span></li><li class="alt"><span>} </span></li></ol></div><pre class="cpp" name="code" style="display: none;">#include<iostream> #include<algorithm> using namespace std; const int MAXN = 100 + 5; struct Node { int x; int y; Node(int a = 0, int b = 0){x = a; y = b;} }node[MAXN]; bool operator < (Node a, Node b) { if(a.x * a.x + a.y * a.y != b.x * b.x + b.y * b.y) return a.x * a.x + a.y * a.y > b.x * b.x + b.y * b.y; else if(a.x != b.x) return a.x < b.x; else return a.y < b.y; } int main() { node[0] = Node(1, 1); node[1] = Node(2, 3); node[2] = Node(-2, 3); node[3] = Node(2, -3); sort(node, node + 4); for(int i = 0; i < 4; i++) cout << "(" << node[i].x << ", " << node[i].y << ")" << endl; return 0; } </pre><br><span style="color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;">运行结果:</span> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> </p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (-2, 3)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (2, -3)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (2, 3)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (1, 1)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 记住operator < 的格式即可。</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 其中Node(int a = 0, int b = 0){} 是c++里构造函数的用法</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> </p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span><span><span style="margin:0px;padding:0px;font-size:24px;color:rgb(255,0,0);">练习:PAT甲级1109</span></span></span></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> https://www.patest.cn/contests/pat-a-practise/1109</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (自行注册账号并AC)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 提示:算法竞赛必须避免使用cin、string,尤其是数据规模破千的题目</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 因此,可以直接使用char数组来替代string,同时加入头文件<cstring></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span style="margin:0px;padding:0px;font-size:18px;"><span>但字符串二维数组是无法用来做sort排序的,但是可以通过结构体里放一维数组,再给结构体数组排序来实现!</span></span></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 函数strlen(a)获取char数组a从a[0]到第一个'\0'之前的长度(不包括\0,比如char a[]={'a','\0','b','\0'}调用strlen(a)返回1)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 函数strcmp(a, b)比较字符串a与b,如果相同返回0,如果前者字典序更小返回负数,否则返回正序(因此不能用来做sort的cmp函数)</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span>函数memset(a, k, sizeof(a))用来给数组a全体赋值,其中常数k只能是0或者-1,不能是其他数字(因为是对字节操作不是对单个元素操作,这点可以从第三个参数看出),一般用来做多组用例下的数组的清零操作</span></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 函数memcpy(a, b, sizeof(b))用来将b数组的sizeof(b)个字节整体赋值给数组a</p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> </p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 下面给出一个字符数组指针排序的示例,每个字符串最多输入19个字符:(竞赛一般不这么写,都是避免指针,在结构体内写一维数组然后对结构体排序)</p> <div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 442px; top: 3246px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#include<cstdio> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include<cstring> </span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include<algorithm> </span><span> </span></span></li><li class=""><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class="alt"><span><span class="datatypes">char</span><span> *a[200]; </span></span></li><li class=""><span><span class="datatypes">bool</span><span> cmp(</span><span class="datatypes">char</span><span> *s1, </span><span class="datatypes">char</span><span> *s2) </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> l1 = strlen(s1); </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> l2 = strlen(s2); </span></span></li><li class=""><span> <span class="datatypes">int</span><span> len = l1 < l2 ? l1 : l2; </span></span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < len; i++) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="keyword">if</span><span>(s1[i] != s2[i]) </span><span class="keyword">return</span><span> s1[i] < s2[i]; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> l1 < l2; </span></span></li><li class=""><span>} </span></li><li class="alt"><span> </span></li><li class=""><span><span class="datatypes">int</span><span> main() </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> n = 5; </span></span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < n; i++) </span></span></li><li class=""><span> {<span class="comment">//必须先内存,否则会产生空指针异常 </span><span> </span></span></li><li class="alt"><span> a[i] = (<span class="datatypes">char</span><span>*)malloc(20*</span><span class="keyword">sizeof</span><span>(</span><span class="datatypes">char</span><span>)); </span></span></li><li class=""><span> scanf(<span class="string">"%s"</span><span>, a[i]); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> sort(a, a + n, cmp); </span></li><li class="alt"><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < n; i++) printf(</span><span class="string">"%s\n"</span><span>, a[i]); </span></span></li><li class=""><span> <span class="keyword">return</span><span> 0; </span></span></li><li class="alt"><span>} </span></li></ol></div><pre class="cpp" name="code" style="display: none;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char *a[200]; bool cmp(char *s1, char *s2) { int l1 = strlen(s1); int l2 = strlen(s2); int len = l1 < l2 ? l1 : l2; for(int i = 0; i < len; i++) { if(s1[i] != s2[i]) return s1[i] < s2[i]; } return l1 < l2; } int main() { int n = 5; for(int i = 0; i < n; i++) {//必须先内存,否则会产生空指针异常 a[i] = (char*)malloc(20*sizeof(char)); scanf("%s", a[i]); } sort(a, a + n, cmp); for(int i = 0; i < n; i++) printf("%s\n", a[i]); return 0; } </pre> <h1 style="margin:.8em 0px;font-size:2.6em;font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-weight:100;line-height:1.1;color:rgb(69,69,69);padding:0px;"> 2017.04.11 <span style="margin:0px;padding:0px;font-size:12px;">sort补充篇</span></h1> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span><span><br></span></span></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span style="margin:0px;padding:0px;font-size:24px;color:rgb(255,0,0);"><span><span><span>练习:PAT甲级1075</span></span></span></span></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> https://www.patest.cn/contests/pat-a-practise/1075</div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 提示:不论是cin还是scanf,当我们输入int型时,都是忽略前缀0,比如00032依旧是读入的32,而输出时如果想保证有前缀0,必须用printf套格式</div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 举例:.4f 默认四舍五入 double型scanf必须用%lf,输出必须用%f(不带l)</div> <br><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 442px; top: 4077px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#include<cstdio> </span><span> </span></span></li><li class=""><span><span class="datatypes">int</span><span> main() </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">double</span><span> a = 003.14159; </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> b = 0032; </span></span></li><li class=""><span> printf(<span class="string">"%.4f %06d"</span><span>, a, b); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> 0; </span></span></li><li class=""><span>} </span></li></ol></div><pre class="cpp" name="code" style="display: none;">#include<cstdio> int main() { double a = 003.14159; int b = 0032; printf("%.4f %06d", a, b); return 0; } </pre> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 结果:</div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 3.1416 000032</div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 下面进一步介绍另外一种结构体内的操作符重载</div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span><span style="margin:0px;padding:0px;font-weight:normal;font-size:18px;">这种模式的操作符重载格式请读者牢记,将<写到结构体内的效率至少是写在外面的3倍以上,以后所有的结构体排序均写成这样</span></span></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> 以昨天的示例为例:平面直角坐标系中,所有的点按距离原点的欧拉距离从大到小排列。相同距离再按x升序排列。相同的x再按y升序排列</div> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <p style="margin-top:0px;margin-bottom:0px;padding-top:0px;padding-bottom:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <br></p> <div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_self">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_self">copy</a><div style="position: absolute; left: 442px; top: 4595px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_self">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;" target="_self">?</a></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#include<iostream> </span><span> </span></span></li><li class=""><span><span class="preprocessor">#include<algorithm> </span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">const</span><span> </span><span class="datatypes">int</span><span> MAXN = 100 + 5; </span></span></li><li class=""><span><span class="keyword">struct</span><span> Node </span></span></li><li class="alt"><span>{ </span></li><li class=""><span> <span class="datatypes">int</span><span> x; </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> y; </span></span></li><li class=""><span> Node(<span class="datatypes">int</span><span> a = 0, </span><span class="datatypes">int</span><span> b = 0){x = a; y = b;} </span></span></li><li class="alt"><span> <span class="datatypes">bool</span><span> operator < (</span><span class="keyword">const</span><span> Node& b) </span><span class="keyword">const</span><span> </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="keyword">if</span><span>(x * x + y * y != b.x * b.x + b.y * b.y) </span></span></li><li class=""><span> <span class="keyword">return</span><span> x * x + y * y > b.x * b.x + b.y * b.y; </span></span></li><li class="alt"><span> <span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(x != b.x) </span></span></li><li class=""><span> <span class="keyword">return</span><span> x < b.x; </span></span></li><li class="alt"><span> <span class="keyword">else</span><span> </span></span></li><li class=""><span> <span class="keyword">return</span><span> y < b.y; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>}node[MAXN]; </span></li><li class="alt"><span> </span></li><li class=""><span> </span></li><li class="alt"><span><span class="datatypes">int</span><span> main() </span></span></li><li class=""><span>{ </span></li><li class="alt"><span> node[0] = Node(1, 1); </span></li><li class=""><span> node[1] = Node(2, 3); </span></li><li class="alt"><span> node[2] = Node(-2, 3); </span></li><li class=""><span> node[3] = Node(2, -3); </span></li><li class="alt"><span> sort(node, node + 4); </span></li><li class=""><span> <span class="keyword">for</span><span>(</span><span class="datatypes">int</span><span> i = 0; i < 4; i++) </span></span></li><li class="alt"><span> cout << <span class="string">"("</span><span> << node[i].x << </span><span class="string">", "</span><span> << node[i].y << </span><span class="string">")"</span><span> << endl; </span></span></li><li class=""><span> <span class="keyword">return</span><span> 0; </span></span></li><li class="alt"><span>} </span></li></ol></div><pre class="cpp" name="code" style="display: none;">#include<iostream> #include<algorithm> using namespace std; const int MAXN = 100 + 5; struct Node { int x; int y; Node(int a = 0, int b = 0){x = a; y = b;} bool operator < (const Node& b) const { if(x * x + y * y != b.x * b.x + b.y * b.y) return x * x + y * y > b.x * b.x + b.y * b.y; else if(x != b.x) return x < b.x; else return y < b.y; } }node[MAXN]; int main() { node[0] = Node(1, 1); node[1] = Node(2, 3); node[2] = Node(-2, 3); node[3] = Node(2, -3); sort(node, node + 4); for(int i = 0; i < 4; i++) cout << "(" << node[i].x << ", " << node[i].y << ")" << endl; return 0; } </pre><br><br><div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> <span><span><span style="margin:0px;padding:0px;font-weight:normal;font-size:24px;color:rgb(255,0,0);"><span>练习:南邮网赛G题 排序+贪心推公式综合题</span></span></span></span></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2184<br></div> <div style="margin:0px;padding:0px;color:rgb(69,69,69);font-family:'PingFang SC', 'Microsoft YaHei', SimHei, Arial, SimSun;font-size:16px;"> (请自行用自己的账号登录并AC)</div> <br> </div> </div>
【结构体排序】从大佬学长那copy来的
猜你喜欢
转载自blog.csdn.net/qq_36720186/article/details/80053218
今日推荐
周排行