在处理数据的时候,由于排序方法会经常用到,所以C语言的库函数里面自带了快速排序的函数qsort(),对大型数据而言,“快速排序”方法是最有效的排序方法之一。它是把数组不断的分成更小的数组,直到变成单元素数组。首先把数据分成两部分,一部分的值都小于另一部分的值。这个过程一直持续到数组完全排好序为止。
其函数原型如下所示:
void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));
总共有四个参数:
下面来演示这个函数的用法。
int num[10]= {5,1,3,7,2,9,8,0,4,6};
int cmp_int(const void *p1,const void *p2 ) /*参数格式为 无符号型*/
{
int *a = (int *)p1; /*强制类型转换*/
int *b = (int *)p2;
return *a - *b; /* a > b时升序排列 a < b 时降序排列*/
}
int main()
{
int i;
qsort(num,10,sizeof(num[0]),cmp_int);
for(i=0; i<10; i++)
printf("%d ",num[i]);
system("pause");
return 0;
}
定义一个整形的数组num,然后使用qsort()函数对数组元素进行排序,第一次参数就是数组的地址,第二个参数是数组元素的个数,第三个参数是数组中每个元素所占字节的大小,最后一个参数要传递进去一个函数。cmp_int( )函数就是用来描述按照那种方式进行排序,当返回值大于0时,按照升序排列,当返回值小于0时,按照降序排列。排序结果如下:
如果想要数组元素降序排列时,将cmp_int( )函数中的返回值改为
return *b - *a;
qsort()函数不仅可以对整形数组排序,也可以对字符数组进行排序。
int ch[10]= {'a','r','e','d','s','t','q','v','j','w'};
int cmp_char(const void *p1,const void *p2 ) /*参数格式为 无符号型*/
{
char *a = (char *)p1; /*强制;类型转换*/
char *b = (char *)p2;
return *a - *b; /* a > b时升序排列 a < b 时降序排列*/
}
int main()
{
int i;
qsort(ch,10,sizeof(ch[0]),cmp_char);
for(i=0; i<10; i++)
printf("%c ",ch[i]);
system("pause");
return 0;
}
对字符数组排序和对整形数组排序很相似,只需要修改传入到qsort( )函数中最后一个参数就行。将函数中强制类型转换由整形修改为字符型。
char strs[5][10]= {
"sdsad",
"tretew",
"fjhjt",
"nkjkjf",
"sdaqr"
};
int cmp_str(const void *p1,const void *p2 ) /*参数格式为 无符号型*/
{
char *a = (char *)p1; /*强制;类型转换*/
char *b = (char *)p2;
return strcmp(a,b); /* a > b时升序排列 a < b 时降序排列*/
}
int main()
{
int i;
qsort(strs,5,sizeof(strs[0]),cmp_str);
for(i=0;i<5;i++)
puts(strs[i]);
system("pause");
return 0;
}
对字符串排序和对字符排序方法是一样的,都是直接比较的是字符的ASCII码值大小,如果第一个字符相同的话,就接着比较第二个字符,在比较两个字符串大小的时候可以直接使用库函数strcmp( )来进行比较。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_20222919/article/details/121267237
内容来源于网络,如有侵权,请联系作者删除!