C语言qsort函数的简介和用法,保证简洁明了!
C语言之qsort函数详解

C语⾔之qsort函数详解⽬录⼀.qsort函数原型⼆.qsort常见的⼏种⽐较函数1.int类型的排序2.double类型的排序3.char类型的排序4.字符串的排序:1.按⾸字母排序2.按字符串长度排序:总结⼀.qsort函数原型qsort 功能: 使⽤快速排序例程进⾏排序,这个函数是根据⼆分法写的,其时间复杂度为n*log(n)#include<stdlib.h>void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *))各参数:1. 待排序数组⾸地址(可直接输⼊待排序数组名,或是指向数组的指针)2. 数组中待排序元素数量(可以⽤sizeof()来求)3. 各元素的占⽤空间⼤⼩(可以⽤sizeof(arr[0])来求)4. 指向函数的指针这个qsort需要我们⾃⼰创建⼀个⽐较函数,基本都是这个函数int cmp(const void* _a, const void* _b);⼆.qsort常见的⼏种⽐较函数1.int类型的排序int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *a-*b;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}*a-*b这个是从⼩到⼤排序,如果想从⼤到⼩排序就是*b-*a;升序排序结果图:降序排列:int cmp(const void* _a, const void* _b){int* a = (int*)_a;int* b = (int*)_b;return *b-*a;}int main(){int num[10] = { 5,7,8,1,26,52,9,3,14,56 };int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%d ", num[i]);}}其实降序排序就是换成*b-*a降序排序效果图:2.double类型的排序int cmp(const void* _a, const void* _b){double* a = (double*)_a;double* b = (double*)_b;return *(double*)_a > *(double*)_b ? 1 : -1;;}int main(){double num[4] = { 2.1,5.2,3.2,445.2};int sz = sizeof(num) / sizeof(num[0]);qsort(num, sz, sizeof(num[0]), cmp);int i = 0;for (i = 0; i < sz; i++){printf("%.2f ", num[i]);}}double类型的⽐较特殊,因为返回值是int,所以如果是两个特别相近的浮点数相减,那么就有可能会出现的结果⽐-1⼤并且⽐1⼩,这样系统就会默认为0,所以这⾥使⽤了⼀个三⽬运算,⽤来⽐较。
qsort 用法

qsort 用法qsort 是一个C库函数,用于对数组进行快速排序。
它可以按照特定的比较函数,对数组中的元素进行排序。
以下是关于 qsort 函数的一些用法:1. 函数原型:```cvoid qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));```- base:指向待排序数组的首个元素的指针。
- nitems:待排序数组中元素的个数。
- size:每个元素的字节大小。
- compar:用户自定义的比较函数。
2. 比较函数的定义:比较函数用于定义排序的方式,它必须满足以下规则:- 如果第一个元素小于第二个元素,则返回一个负数。
- 如果第一个元素大于第二个元素,则返回一个正数。
- 如果两个元素相等,则返回零。
比较函数的原型如下:```cint compar(const void *a, const void *b);3. 示例用法:假设我们有一个整型数组,需要按从小到大的顺序进行排序。
下面是一个示例代码:```c#include <stdio.h>#include <stdlib.h>// 比较函数int compar(const void *a, const void *b) {return (*(int*)a - *(int*)b);}int main() {int arr[] = {9, 5, 2, 7, 1};int n = sizeof(arr) / sizeof(arr[0]);// 使用 qsort 对数组进行排序qsort(arr, n, sizeof(int), compar);// 打印排序后的数组for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;```输出结果:```1 2 5 7 9```在上面的示例中,我们首先定义了一个比较函数 `compar`,该函数按照从小到大的顺序对整数进行比较。
qsort函数在c语言中的含义

一、概述qsort函数是C语言标准库中的一个用于排序数组的函数。
它可以根据用户自定义的比较函数对数组进行排序,是C语言中非常常用的排序函数之一。
二、函数原型qsort函数的函数原型如下:void qsort(void *base, size_t nmemb, size_t size, int (par)(const void *, const void *));其中,参数说明如下:1. base:指向要排序的数组的指针。
2. nmemb:数组中元素的数量。
3. size:数组中每个元素的大小。
4.par:比较函数的指针,用于指定排序时的比较规则。
三、比较函数qsort函数的核心在于比较函数,比较函数的定义如下:intpar(const void* a, const void* b);比较函数接受两个参数a和b,分别指向待比较的数组元素。
比较函数需要根据实际需求编写,它应该按照排序的规则来比较a和b,并返回结果。
比较函数返回值的含义为:- 若a应排在b之前,则返回负值;- 若a应排在b之后,则返回正值;- 若a与b相等,则返回0。
四、函数用法使用qsort函数进行排序的一般步骤如下:1. 定义比较函par,根据排序需求编写比较规则。
2. 调用qsort函数进行排序,示例代码如下:```cintpare(const void* a, const void* b) {return *(int*)a - *(int*)b;}int m本人n() {int arr[] = {4, 2, 8, 5, 1};int len = sizeof(arr) / sizeof(arr[0]);qsort(arr, len, sizeof(int),pare);return 0;}```这段示例代码演示了如何使用qsort函数对整型数组进行升序排序。
五、注意事项在使用qsort函数时,需要注意以下几点:1. 比较函数的正确性和效率会直接影响排序结果和性能,因此需要仔细编写和测试比较函数。
C语言常用函数

用法:#include <string.h>
功能:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符ch则停止复制。
说明:返回指向字符ch后的第一个字符的指针,如果src前n个字节中不存在ch则返回NULL。ch被复制。
5. memchr
C函数qsort()和bsearch()的用法
使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。
qsort 的函数原型是void __cdecl qsort (void *base,size_t num,size_t width,
int (__cdecl *comp)(const void *,const void*))
用法:#include <string.h>
功能:在字符串s1中搜寻s2中所出现的字符。
说明:返回第一个出现的字符在s1中的下标值,亦即在s1中出现而s2中没有出现的子串的长度.
18.strdup
原型:extern char *strdup(char *s);
所以,
int i;
sizeof(i);//ok
sizeof i;//ok
sizeof(int);//ok
sizeof int;//error
Partition
Partition 函数 返回一个 Variant(String),指定一个范围,在一系列计算的范围中指定的数字出现在这个范围内。
6.memicmp
原型:extern int memicmp(void *buf1, void *buf2, unsigned int count);
qsort,sort排序

C语言标准库函数qsort详解qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。
排序之后的结果仍然放在原数组中。
使用qsort函数必须自己写一个比较函数。
函数原型:void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );指向任意数据类型的指针都可以转换为void*类型用法以及参数说明:Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.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.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.base Pointer to the first element of the array to be sorted.(数组起始地址)num Number of elements in the array pointed by base.(数组元素个数)size Size in bytes of each element in the array.(每一个元素的大小)comparator Function that compares two elements.(函数指针,指向比较函数)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.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. Return Value none (无返回值)给你们的C++帮助文档上面的语法及定义是:语法:对buf指向的数据(包含num项,每项的大小为size)进行快速排序。
c语言qsort的使用

c语⾔qsort的使⽤⽬的基于快速排序对数组进⾏排序,数组元素可以是结构体。
前提qsort属于内置函数,需要包含头⽂件 stdlib.h函数原型void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) );/**void *ptr:空指针, 指向需要排序的数组size_t count:数组元素个数,size_t在32位机器上unsigned int(4byte),64位机器上unsigned long(8byte)size:数组元素的字节数⼤⼩,通常⽤sizeof()来计算,平台不同,同⼀类型的变量占据的字节数可能不⽤,增强可移植性int (*comp)(const void *, const void *) : 函数指针,将函数名作为参数,该函数的形参的类型均为const void *,函数外表是⼀样的,内容却有所不同,返回值类型相同**/⽤户⾃定义函数指明具体的⽐较对象int cmp(const void *a, const void *b); // ⾃定义函数内容,若果a值⼤于b值,返回1,{/**在函数内部将const void* 转换成实际的类型;**///默认升序写法if ( *(MyType*)a < *(MyType*)b )return -1;if ( *(MyType*)a == *(MyType*)b )return 0;if ( *(MyType*)a > *(MyType*)b )return 1;}结构体排序struct Node {int x;}s[100];int cmp(const void *a, const void *b);{if ( (*(Node*)a)->x < (*(Node*)b)->x )return -1;if ( (*(Node*)a)->x == (*(Node*)b)->x )return 0;if ( (*(Node*)a)->x > (*(Node*)b)->x )return 1;}多级排序⽤于结构体内有多个成员时,当x相同时,⽐较y,以此类推即可。
qsort排序函数

qsort排序函数qsort函数是C语言标准库中的一个函数,用于对数组进行快速排序。
它的原型为:void qsort(void base, size_t num, size_t size, int (compar)(const void , const void ));参数解释:void base,指向要排序的数组的指针。
size_t num,数组中的元素个数。
size_t size,数组中每个元素的大小(以字节为单位)。
int (compar)(const void , const void ),指向比较函数的指针。
比较函数的原型为:int compar(const void a, const void b);qsort函数使用快速排序算法对数组进行排序。
快速排序是一种高效的排序算法,它通过递归地将数组分成较小的子数组,然后对子数组进行排序以实现整体的排序。
在实际使用中,可以根据具体的需求编写比较函数,以指定排序的规则。
使用qsort函数时需要注意以下几点:1. 确保比较函数的正确性,比较函数需要满足传递性、反对称性和传递性的要求,否则排序结果可能不正确。
2. 确保数组指针和元素大小的正确性,传递给qsort函数的数组指针和元素大小需要正确,否则可能导致未定义的行为。
3. 注意内存管理,在使用qsort函数时,需要注意数组内存的分配和释放,以避免内存泄漏和越界访问等问题。
总之,qsort函数是C语言中用于对数组进行快速排序的标准库函数,通过合理编写比较函数和正确传递参数,可以实现对数组的高效排序。
在实际应用中,需要注意算法的稳定性、性能和内存管理等方面的问题,以确保排序的正确性和效率。
C语言中qsort函数用法-示例分析

C语⾔中qsort函数⽤法-⽰例分析⽂章转载⾃:本⽂实例汇总介绍了C语⾔中qsort函数⽤法,包括针对各种数据类型参数的排序,⾮常具有实⽤价值⾮常具有实⽤价值。
分享给⼤家供⼤家参考。
C语⾔中的qsort函数包含在<stdlib.h>的头⽂件⾥,本⽂中排序都是采⽤的从⼩到⼤排序。
⼀、对int类型数组排序int num[100];int cmp (const void *a, const void *b) {return *(int *)a-*(int *)b;}qsort(num, 100, sizeof(num[0]), cmp);⼆、对char类型数组排序(同int类型)char word[100];int cmp(const void *a, const void *b) {return *(char *)a-*(char *)b;}qsort(word, 100, sizeof(word[0]), cmp);三、对double类型数组排序(特别要注意)double db[100];int cmp(const void *a, const void *b) {return *(double *)a > *(double *)b? 1:-1;}qsort(db, 100, sizeof(db[0]), cmp);四、对结构体⼀级排序struct Ttype {double data;int other;}s[100];int cmp(const void *a, const void *b) {return (*(struct Ttype *)a)->data > (*(struct Ttype *)b)->data? 1:-1;}qsort(s,100,sizeof(s[0]),cmp);五、对结构体⼆级排序struct Ttype {int x;int y;}s[100];//按照x从⼩到⼤排序,当x相等时按照y从⼤到⼩排序int cmp(const void *a , const void *b) {struct Ttype *c = (struct Ttype *)a;struct Ttype *d = (struct Ttype *)b;if(c->x != d->x) return c->x-d->x;else return d->y-c->y;}qsort(s, 100, sizeof(s[0]), cmp);六、对字符串进⾏排序struct Ttype {int data;char str[100];}s[100];//按照结构体中字符串str的字典顺序排序int cmp(const void *a, const void *b) {return strcmp((*(struct Ttype *)a)->str, (*(struct Ttype *)b)->str);}qsort(s, 100, sizeof(s[0]), cmp);相信本⽂所述实例对⼤家C程序设计的学习有⼀定的借鉴价值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• int cmp ( const void *a , const void *b ) •{ • return strcmp( (*(In *)a)->str , (*(In *)b)->str ); •}
• qsort(s,100,sizeof(s[0]),cmp);
Cmp()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
• 应用qsort对int数组进行排序:
• #include <stdio.h>
• #include <stdlib.h>
• int cmp_1 ( int *a , int *b )
•{
• return *a - *b;
•}
• int cmp_2 ( int *a , int *b )
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为:
• void qsort(void *base,size_t nelem,size_t width, cmp);
• *base 为要排序的数组 • nelem 为要排序的数组的长度 • width 为数组元素的大小(一字节为单位) • 简单示例:对int num[100]排序,qsort中各参数
•
{
•
if(a->x != b->x)
•
return a->x - b->x; ////按照x从小到大排序,当x相等时按照y从大到小排序
•
else return a->y - b->y ;
•
}
•
void main()
•Hale Waihona Puke {•int sum=0,n;
•
int i,j;
•
freopen("in.txt","r",stdin);
•
printf("\n");
• • • • •}
qsort(num,10,sizeof(num[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
printf("%d ",num[i]); printf("\n");
• 应用qsort对char数组进行排序:
• #include <stdio.h>
• Int Cmp(const void *a , const void *b )中有两个元素作为参数, 返回一个int值, 如果比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返 回小于零 qsort就认为 a<b 。
qsort 知道元素大小,就可以把大的放到前面去。
怎么写? • qsort(num,100,sizeof(num[0]),cmp);
自定义比较函数
• 比较函数的名字是自定义的(这里我们用CMP命名); • Cmp:qsort 要求提供的这个函数是一个需要自己定义的比较函
数,比较函数使得qsort通用性更好。有了比较函数qsort可以实 现对数组,字符串,结构体等结构进行升序或降序排序。
•
for(i=0;i<n;i++)
•
printf("%d %d ",data[i].x,data[i].y);
•
printf("\n");
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•}
• 输入:
•4
• 02
• 21
• 38
• 63
•0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);
printf("%c ",ch[i]); printf("\n");
• 应用qsort对结构体一级排序:
• #include <stdio.h>
• #include <stdlib.h>
• struct coord
•{
•
int x;
•
int y;
• }data[100];
• int cmp(struct coord *a ,struct coord *b) //根据y的大小排序
•{
• return *b - *a;
•}
• void main()
•{
•
int num[10]={1,3,5,7,9,2,4,6,8,0};
•
int i;
•
qsort(num,10,sizeof(num[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%d ",num[i]);
• #include <stdlib.h>
• int cmp_1 ( char *a , char *b )
•{
• return *a - *b;
•}
• int cmp_2 ( char *a , char *b )
•{
• return *b - *a;
•}
• void main()
•{
•
char ch[10]={"bcadfegihj"};
•
int i;
•
qsort(ch,10,sizeof(ch[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%c ",ch[i]);
•
printf("\n");
• • • • •}
qsort(ch,10,sizeof(ch[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
C函数qsort的简介和用法
BY:SMJUN
C函数qsort实现快速排序
排序方法有很多种:选择排序,冒泡排序, 归并排序,快速排序等。
看名字都知道快速排序 是目前公认的一种 比较好的排序算法,比选择排序,冒泡排 序都要快。因为它的速度很快,所以系统 也在库里实现这个算法,便于我们的使用。
这就是qsort。
• strcmp包含在<string.h>的头文件里
END
printf("\n");
• 应用qsort对结构体二级排序:
•
#include <stdio.h>
•
#include <stdlib.h>
•
struct coord
•
{
•
int x;
•
int y;
•
}data[100];
•
int cmp(struct coord *a ,struct coord *b)
•{
•
return a->y - b->y ;
•}
• void main()
•{
•
int sum=0,n;
•
int i,j;
•
//freopen("in.txt","r",stdin);
•
while(scanf("%d",&n)!=EOF&&n)
•
{
•
for(i=0;i<n;i++)
•
scanf("%d %d",&data[i].x,&data[i].y);
如果你的比较函数放回本来应该是1 的(a>b),你比较函数却返 回一个 -1 (小于零的)那么qsort认为a<b 的,就把 b放到前面 去,但实际上是a大于b的,所以就造成升降序的差别了。 • 简单来说,比较函数的作用就是给qsort指明元素的大小是怎么 比较的。
简单示例:对int num[100]中的元素从小到大排序。 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //强制转换类型 } qsort(num,100,sizeof(num[0]),cmp);
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•
}
•
输入:
•
5
•
22
•
21
•
43
•
39
•
42
•
0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);