c++ 库中的排序算法 qsort

来源:互联网 发布:淘宝代刷网站 编辑:程序博客网 时间:2024/06/08 01:21

qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分发写的,其时间复杂度为n*log(n),其结构为:

void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));

其中:

参数: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数指针,用于确定排序的顺 (默认是从小到大排序的!)

* Comp(const void *p1,const void *p2) 为判断大小函数的指针,这个函数需要自己定义,如果p1>p2,函数返回-1a<b,函数返回1a==b函数返回0

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。
看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听说速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。


降序,那又怎么办?

这都可以通过定义比较函数来做到的。
比较函数的作用就是给qsort指明元素的大小是怎么比较的。
像这样的比较函数 inline int MyCmp(const void* a, const void* b) 

都是有两个元素作为参数,返回一个int值, 如果比较函数返回大于0qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为这两个元素相等,返回小于零 qsort就认为 a<b 


qsort 
知道元素大小,就可以把大的放到前面去。

如果你的比较函数放回本来应该是的(a>b),你比较函数却返回一个 -1 (小于零的)那么qsort认为a<b 的,就把 b放到前面去,但实际上是a大于b的,所以就造成升降序的差别了。

<span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span>
#include <algorithm>using namespace std;
int compare1(const void* a,const void* b)//升序{int*pa=(int*)a,*pb=(int*)b;if(*pa>*pb) return -1;else if (*pa==*pb)   return 0;else  return 1;}
int compare2(const void* a,const void* b)//升序{int*pa=(int*)a,*pb=(int*)b;if(*pa>*pb) return 1;else if (*pa==*pb)   return 0;else  return -1;}void main(){int a[5]={3,2,4,5,1};<pre code_snippet_id="414600" snippet_file_name="blog_20140702_1_34978" name="code" class="html"><span style="white-space:pre"></span>qsort(a,5,sizeof(int),compare1);
for(int i=0;i<5;i++)cout<<a[i]<<"\t";cout<<endl;qsort(a,5,sizeof(int),compare2);for( i=0;i<5;i++)cout<<a[i]<<"\t";cout<<endl;}

0 0
原创粉丝点击