关于qsort函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于qsort函数相关的知识,希望对你有一定的参考价值。
有这样 一组数23,44,12,42,14,35,47,31,9,20
现在要以一个整数的各位数字之和的大小为依据,以小到大排序,用qsort()函数这程序怎么写?????
我想知道这条语句*(int *)a-*(int *)b;它是怎么执行的,像是一个数组的话,它能返回很多个值吗???
用c++语言编写
一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);
其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写s[i]这样的表达式);
第二个参数是参与排序的元素个数;
第三个参数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式;
第四个参数就是让很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦...
我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么的).典型的cmp的定义是int cmp(const void *a,const void *b);
返回值必须是int,两个参数的类型必须都是const void *,那个a,b是我随便写的,个人喜好.
假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回
0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序.
下面举例:
No.2.最常见的,对int数组排序
#include stdio.h
#include string.h
#include stdlib.hint s[10000],n,i;int cmp(const void *a, const void *b)
return(*(int *)a-*(int *)b);
int main()
scanf("%d",n);
for(i=0;in;i++) scanf("%d",s[i]); qsort(s,n,sizeof(s[0]),cmp); for(i=0;in;i++) printf("%d ",s[i]); return(0);
No.3.对double型数组排序,原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相
等的,只能说fabs(a-b)1e-20之类的这样来判断,所以这里只返回了1和-1
#include stdio.h
#include stdlib.hdouble s[1000];
int i,n;int cmp(const void * a, const void * b)
return((*(double*)a-*(double*)b0)?1:-1);
int main()
scanf("%d",n);
for(i=0;in;i++) scanf("%lf",s[i]); qsort(s,n,sizeof(s[0]),cmp); for(i=0;in;i++) printf("%lf ",s[i]); return(0);
答案补充
因为qsort函数中的参数cmp(也可以取另外名字,反正就是最后一个参数)一定要是int cmp(const void *a,const void *b)这样定义的(系统指定我也没办法).而void*类型是不能直接转换的,所以先(int*)a的意思是将void* a转为int *a,而*((int*)a)则是取a的值,相当于int* a后的*a.这样说懂了没? 参考技术A 20101101
sales.xml(L71)
<action name="protocol" class="com.kylin.sales.action.LoginAct"
method="protocol">
<result name="success" type="freemarker">/protocol.jsp</result>
</action>
LoginAct.java(L91)
public String protocol() throws Exception
return SUCCESS;
protocol.jsp()
<#include "./common_ftl/path.ftl">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>注册服务条款</title>
<link rel="stylesheet" type="text/css" href="$relative_path()/css/pink/common.css" />
<script src="js/jquery-1.4.2.min.js"></script>
</head>
<body onblur="self.focus()">
<div id="container">
<#include "./common_ftl/h2.htm">
<p>to be pendding...</p>
<#include "./common_ftl/f.htm">
</div>
<div id="extraDiv1"> </div>
<div id="extraDiv2"> </div>
<div id="extraDiv3"> </div>
</body>
</html>
qsort 使用啥排序算法?
【中文标题】qsort 使用啥排序算法?【英文标题】:What sorting algorithm does qsort use?qsort 使用什么排序算法? 【发布时间】:2012-11-01 11:28:38 【问题描述】:我找不到任何关于 C qsort
函数使用什么排序算法的信息。
是快速排序吗? man中没有提到。
【问题讨论】:
【参考方案1】:未指定qsort
的实现:实现可以使用任何排序算法。有趣的是,排序不需要稳定,也没有复杂度要求。
qsort
(C11 §7.22.5.2)的整个规范如下:
qsort
函数概要
#include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
说明
qsort
函数对nmemb
对象数组进行排序,其初始元素为 由base
指向。每个对象的大小由size
指定。数组的内容根据compar指向的比较函数升序排序,该函数使用两个指向被比较对象的参数调用。如果认为第一个参数分别小于、等于或大于第二个参数,则该函数应返回一个小于、等于或大于零的整数。
如果两个元素比较相等,则它们在结果排序数组中的顺序是未指定的。
退货
qsort
函数不返回任何值。
【讨论】:
【参考方案2】:理论上,qsort只定义到qsort
和bsort
的返回值和调用值的地步。 Here 是 ISO 标准参考。
在实践中,它通常使用quicksort。
【讨论】:
【参考方案3】:作为对 James McNellis 对标准的引用的补充,值得注意的是 GNU’s libc documentation 这么说
qsort
函数的名称来源于它最初是使用“快速排序”算法实现的。
它决定使用alternative algorithm,显然是合并排序。
【讨论】:
以上是关于关于qsort函数的主要内容,如果未能解决你的问题,请参考以下文章