﻿<?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++博客-张扬-随笔分类-c++学习</title><link>http://www.cppblog.com/zhangyang/category/11108.html</link><description>心随我动</description><language>zh-cn</language><lastBuildDate>Mon, 10 Aug 2009 16:00:41 GMT</lastBuildDate><pubDate>Mon, 10 Aug 2009 16:00:41 GMT</pubDate><ttl>60</ttl><item><title>qsort()排序函数的使用qsort函数应用大全</title><link>http://www.cppblog.com/zhangyang/archive/2009/08/09/92729.html</link><dc:creator>张扬</dc:creator><author>张扬</author><pubDate>Sun, 09 Aug 2009 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/zhangyang/archive/2009/08/09/92729.html</guid><wfw:comment>http://www.cppblog.com/zhangyang/comments/92729.html</wfw:comment><comments>http://www.cppblog.com/zhangyang/archive/2009/08/09/92729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangyang/comments/commentRss/92729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangyang/services/trackbacks/92729.html</trackback:ping><description><![CDATA[<p>在c++中qsort()排序函数的使用qsort函数应用大全<br></p>
<p>qsort包含在&lt;stdlib.h&gt;头文件中，此函数<span id=reply_content_102844294>根据你给的比较条件进行快速排序，通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。</span></p>
<p>函数原型：</p>
<p><span style="COLOR: #0000ff">void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );</span></p>
<p>用法以及参数说明：</p>
<p>Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.</p>
<p>The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements of the array.</p>
<p>The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.</p>
<p><strong>base</strong> Pointer to the first element of the array to be sorted.(数组起始地址)<br><strong>num</strong> Number of elements in the array pointed by base.(数组元素个数)<br><strong>size</strong> Size in bytes of each element in the array.(每一个元素的大小)<br><strong>comparator</strong> Function that compares two elements.(函数指针，指向比较函数)<br>1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.<br>2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.<br><strong>Return Value</strong> none (无返回值)<br><br>七种qsort排序方法 </p>
<p>&lt;本文中排序都是采用的从小到大排序&gt; </p>
<p>一、对int类型数组排序 </p>
<p>int num[100]; </p>
<p>Sample: </p>
<p>int cmp ( const void *a , const void *b ) <br>{ <br>return *(int *)a - *(int *)b; <br>} </p>
<p>qsort(num,100,sizeof(num[0]),cmp); </p>
<p>二、对char类型数组排序（同int类型） </p>
<p>char word[100]; </p>
<p>Sample: </p>
<p>int cmp( const void *a , const void *b ) <br>{ <br>return *(char *)a - *(int *)b; <br>} </p>
<p>qsort(word,100,sizeof(word[0]),cmp); </p>
<p>三、对double类型数组排序（特别要注意） </p>
<p>double in[100]; </p>
<p>int cmp( const void *a , const void *b ) <br>{ <br>return *(double *)a &gt; *(double *)b ? 1 : -1; <br>} </p>
<p>qsort(in,100,sizeof(in[0]),cmp)； </p>
<p>四、对结构体一级排序 </p>
<p>struct In <br>{ <br>double data; <br>int other; <br>}s[100] </p>
<p>//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种，参考上面的例子写 </p>
<p>int cmp( const void *a ,const void *B) <br>{ <br>return (*(In *)a)-&gt;data &gt; (*(In *)B)-&gt;data ? 1 : -1; <br>} </p>
<p>qsort(s,100,sizeof(s[0]),cmp); </p>
<p>五、对结构体二级排序 </p>
<p>struct In <br>{ <br>int x; <br>int y; <br>}s[100]; </p>
<p>//按照x从小到大排序，当x相等时按照y从大到小排序 </p>
<p>int cmp( const void *a , const void *b ) <br>{ <br>struct In *c = (In *)a; <br>struct In *d = (In *)b; <br>if(c-&gt;x != d-&gt;x) return c-&gt;x - d-&gt;x; <br>else return d-&gt;y - c-&gt;y; <br>} </p>
<p>qsort(s,100,sizeof(s[0]),cmp); </p>
<p>六、对字符串进行排序 </p>
<p>struct In <br>{ <br>int data; <br>char str[100]; <br>}s[100]; </p>
<p>//按照结构体中字符串str的字典顺序排序 </p>
<p>int cmp ( const void *a , const void *b ) <br>{ <br>return strcmp( (*(In *)a)-&gt;str , (*(In *)B)-&gt;str ); <br>} </p>
<p>qsort(s,100,sizeof(s[0]),cmp); </p>
<p>七、计算几何中求凸包的cmp </p>
<p>int cmp(const void *a,const void *B) //重点cmp函数，把除了1点外的所有点，旋转角度排序 <br>{ <br>struct point *c=(point *)a; <br>struct point *d=(point *)b; <br>if( calc(*c,*d,p[1]) &lt; 0) return 1; <br>else if( !calc(*c,*d,p[1]) &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>return 1; <br>else return -1; <br>} <br>: </p>
<p>c++中加载头文件 \"iostream\"</p>
<p>c中qsort函数包含在&lt;stdlib.h&gt;的头文件里，strcmp包含在&lt;string.h&gt;的头文件里 <br></p>
<img src ="http://www.cppblog.com/zhangyang/aggbug/92729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangyang/" target="_blank">张扬</a> 2009-08-09 19:45 <a href="http://www.cppblog.com/zhangyang/archive/2009/08/09/92729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>