重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
qsort是编译器函数库自带的快速排序函数。其原型为:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、雅安服务器托管、营销软件、网站建设、张湾网站维护、网站推广。
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
参数含义如下:
base: 待排序数组首地址。
num: 数组中待排序元素数量。
width: 各元素的占用空间大小。
compare: 指向函数的指针,用于确定排序的顺序。
比较难以理解的是compare函数指针,其确定了如何去排序,通过修改该函数指针指向的函数体,可以对复杂类型进行排序,如结构体等。 也可以改变排序方式,如升序或降序。
要达到问题中的效果,需要在第一个参数传入数据所在行的首地址,第二个参数传入一行中元素的个数,第三行传入每个元素占用的空间,第四个传入自定义的比较函数指针(函数名)。
下面就以一个3行4列整型数组a[3][4],对其第二行(a[1])进行升序排序为例,写一个代码,辅助理解。
#include stdio.h
#include stdlib.h
int cmp(const void *a, const void *b)
{
return *((int *)a) *((int *)b);//由于是整型数组,所以将指针转为整型指针后取值,再比较。
}
int main()
{
int a[3][4] =
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定义的原始数组,可以看到是乱序的。
int i,j;
qsort(a[1], 4, sizeof(int), cmp);
//以下代码输出数组元素值,以验证排序结果。
for(i = 0; i 3; i ++)
{
for(j = 0; j 4; j ++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
程序运行后输出:
5 1 54 6
12 22 32 44
34 5 2 1
可以看到第二行已经升序排列,而其它两个没有变化。
C语言中没有预置的sort函数。如果在C语言中,遇到有调用sort函数,就是自定义的一个函数,功能一般用于排序。
一、可以编写自己的sort函数。
如下函数为将整型数组从小到大排序。
void sort(int *a, int l)//a为数组地址,l为数组长度。
{
int i, j;
int v;
//排序主体
for(i = 0; i l - 1; i ++)
for(j = i+1; j l; j ++)
{
if(a[i] a[j])//如前面的比后面的大,则交换。
{
v = a[i];
a[i] = a[j];
a[j] = v;
}
}}
对于这样的自定义sort函数,可以按照定义的规范来调用。
二、C语言有自有的qsort函数。
功 能: 使用快速排序例程进行排序
头文件:stdlib.h
原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
这个函数必须要自己写比较函数,即使要排序的元素是int,float一类的C语言基础类型。
以下是qsort的一个例子:
#includestdio.h
#includestdlib.h
int comp(const void*a,const void*b)//用来做比较的函数。
{
return *(int*)a-*(int*)b;
}
int main()
{
int a[10] = {2,4,1,5,5,3,7,4,1,5};//乱序的数组。
int i;
qsort(a,n,sizeof(int),comp);//调用qsort排序
for(i=0;i10;i++)//输出排序后的数组
{
printf("%d\t",array[i]);
}
return 0;
}
扩展资料:
sort函数的用法(C++排序库函数的调用)
对数组进行排序,在c++中有库函数帮我们实现,这们就不需要我们自己来编程进行排序了。
(一)为什么要用c++标准库里的排序函数
Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!
(二)c++标准库里的排序函数的使用方法
I)Sort函数包含在头文件为#includealgorithm的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
II)Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址的下一地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,排序方法)
下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明!
例一:sort函数没有第三个参数,实现的是从小到大
#includeiostream
#includealgorithm
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i10;i++)
couta[i]endl;
sort(a,a+11);
for(int i=0;i10;i++)
couta[i]endl;
return 0;
}
编译器
GCC,GNU组织开发的开源免费的编译器
MinGW,Windows操作系统下的GCC
Clang,开源的BSD协议的基于LLVM的编译器
Visual C++ :: cl.exe,Microsoft VC++自带的编译器
集成开发环境
CodeBlocks,开源免费的C/C++ IDE
CodeLite,开源、跨平台的C/C++集成开发环境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
Hello World
参考资料:百度百科-sort函数
排序方法有很多种, 选择排序,冒泡排序,归并排序,快速排序等。
看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。
这就是qsort。
qsort 要求提供一个 比较函数,是为了做到通用性更好一点。比如你不仅仅的是要排序一个数字而已,可能你要用来排序几个数字 ,比如有一个结构
struct num {
int a;
int b;
};
然后我有一个num 类型的数组, num dddd[100];
我想给 dddd这个数组排序,那怎么办? 我想让 a +b 最大的num元素排在数组的最前面,那又怎么办?
这都可以通过定义比较函数来做到的。
比较函数的作用就是给qsort指明 元素的大小是怎么比较的。
像这样的比较函数 inline int MyCmp(const void* a, const void* b)
都是有两个元素 作为参数,返回一个int 值, 如果 比较函数返回大于0,qsort就认为 ab , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 ab 。
qsort 知道元素大小,就可以把大的放到前面去。
如果你的比较函数放回本来应该是1 的(ab),你比较函数却返回一个 -1 (小于零的)那么qsort认为ab 的,就把 b放到前面去,但实际上是a大于b的,所以就造成升降序的差别了。
同样的道理,如果有一个 结构
strunt 人{
int 身高;
int 体重;
}
你想让身高最小的人排在最前面,那么你也要自己定义自己的比较函数 ,