﻿<?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/navy/category/7502.html</link><description>致虚，极也。守静，督也。

</description><language>zh-cn</language><lastBuildDate>Sat, 05 Jul 2008 02:47:33 GMT</lastBuildDate><pubDate>Sat, 05 Jul 2008 02:47:33 GMT</pubDate><ttl>60</ttl><item><title>七种qsort排序方法</title><link>http://www.cppblog.com/navy/articles/55236.html</link><dc:creator>致虚守静</dc:creator><author>致虚守静</author><pubDate>Thu, 03 Jul 2008 13:58:00 GMT</pubDate><guid>http://www.cppblog.com/navy/articles/55236.html</guid><wfw:comment>http://www.cppblog.com/navy/comments/55236.html</wfw:comment><comments>http://www.cppblog.com/navy/articles/55236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/navy/comments/commentRss/55236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/navy/services/trackbacks/55236.html</trackback:ping><description><![CDATA[<font face=Verdana>&lt;</font><font face=宋体>本文中排序都是采用的从小到大排序</font><font face=verdana>&gt; <br></font><font face=宋体>一、对</font><font face=verdana>int</font><font face=宋体>类型数组排序</font><font face=verdana> <br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>int num[100]; <br>Sample: <br>int cmp ( const void *a , const void *b ) <br>{ <br>&nbsp; return *(int *)a - *(int *)b; <br>} <br>qsort(num,100,sizeof(num[0]),cmp); <br><br></font><font face=宋体>二、对</font><font face=verdana>char</font><font face=宋体>类型数组排序（同</font><font face=verdana>int</font><font face=宋体>类型）</font><font face=verdana><br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>char word[100]; <br>Sample: <br>int cmp( const void *a , const void *b ) <br>{ <br>&nbsp; return *(char *)a - *(char*)b; <br>}<br>qsort(word,100,sizeof(word[0]),cmp)<br><br></font><font face=宋体>三、对</font><font face=verdana>double</font><font face=宋体>类型数组排序（特别要注意）</font><font face=verdana><br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>double in[100];<br>int cmp( const void *a , const void *b ) <br>{ <br>&nbsp; return *(double *)a &gt; *(double *)b ? 1 : -1; <br>} qsort(in,100,sizeof(in[0]),cmp)</font><font face=宋体>；</font><font face=verdana><br><br></font><font face=宋体>四、对结构体一级排序</font><font face=verdana> <br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>struct In {<br>double data; <br>int other; <br>}s[100] <br>//</font><font face=宋体>按照</font><font face=verdana>data</font><font face=宋体>的值从小到大将结构体排序</font><font face=verdana>,</font><font face=宋体>关于结构体内的排序关键数据</font><font face=verdana>data</font><font face=宋体>的类型可以很多种，</font><font face=verdana><br></font><font face=宋体>参考上面的例子写</font><font face=verdana> <br>int cmp( const void *a ,const void *b) <br>{ <br>&nbsp; return (*(In *)a).data &gt; (*(In *)b).data ? 1 : -1; <br>} <br>qsort(s,100,sizeof(s[0]),cmp); <br><br></font><font face=宋体>五、对结构体二级排序</font><font face=verdana> <br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>struct In { <br>&nbsp; int x; int y; <br>}s[100]; <br>//</font><font face=宋体>按照</font><font face=verdana>x</font><font face=宋体>从小到大排序，当</font><font face=verdana>x</font><font face=宋体>相等时按照</font><font face=verdana>y</font><font face=宋体>从大到小排序</font><font face=verdana> <br>int cmp( const void *a , const void *b ) <br>{ <br>&nbsp; struct In *c = (In *)a; <br>&nbsp; struct In *d = (In *)b; <br>&nbsp; if(c-&gt;x != d-&gt;x) return c-&gt;x - d-&gt;x; <br>&nbsp; else return d-&gt;y - c-&gt;y; <br>} <br>qsort(s,100,sizeof(s[0]),cmp); <br><br></font><font face=宋体>六、对字符串进行排序</font><font face=verdana> <br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>struct In { <br>&nbsp; int data; char str[100]; <br>}s[100]; <br>//</font><font face=宋体>按照结构体中字符串</font><font face=verdana>str</font><font face=宋体>的字典顺序排序</font><font face=verdana> <br>int cmp ( const void *a , const void *b ) <br>{<br>&nbsp; return strcmp( (*(In *)a)-&gt;str , (*(In *)b)-&gt;str ); <br>} <br>qsort(s,100,sizeof(s[0]),cmp); <br><br></font><font face=宋体>七、计算几何中求凸包的</font><font face=verdana>cmp <br></font><font face=宋体>程序代码</font><font face=verdana> </font><font face=宋体>程序代码</font><font face=verdana><br>int cmp(const void *a,const void *b) <br>//</font><font face=宋体>重点</font><font face=verdana>cmp</font><font face=宋体>函数，把除了</font><font face=verdana>1</font><font face=宋体>点外的所有点，旋转角度排序</font><font face=verdana> <br>{ <br>&nbsp; struct point *c=(point *)a; <br>&nbsp; struct point *d=(point *)b; <br>&nbsp; if( calc(*c,*d,p[1]) &lt; 0) return 1; <br>&nbsp; else if( !calc(*c,*d,p[1]) <br>&nbsp; &amp;&amp; dis(c-&gt;x,c-&gt;y,p[1].x,p[1].y) &lt; dis(d-&gt;x,d-&gt;y,p[1].x,p[1].y)) <br>&nbsp; //</font><font face=宋体>如果在一条直线上，则把远的放在前面</font><font face=verdana> <br>&nbsp; return 1; else return -1; <br>}<br><br>PS: </font><font face=宋体>其中的</font><font face=verdana>qsort</font><font face=宋体>函数包含在</font><font face=verdana>&lt;stdlib.h&gt;</font><font face=宋体>的头文件里，</font><font face=verdana>strcmp</font><font face=宋体>包含在</font><font face=verdana>&lt;string.h&gt;</font><font face=宋体>的头文件里</font><font face=verdana> <br></font>
<img src ="http://www.cppblog.com/navy/aggbug/55236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/navy/" target="_blank">致虚守静</a> 2008-07-03 21:58 <a href="http://www.cppblog.com/navy/articles/55236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>