【结构体排序】从大佬学长那copy来的

<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>

猜你喜欢

转载自blog.csdn.net/qq_36720186/article/details/80053218