C语言学习笔记---C库排序函数qsort()

x33g5p2x  于2021-11-12 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(482)

在处理数据的时候,由于排序方法会经常用到,所以C语言的库函数里面自带了快速排序的函数qsort(),对大型数据而言,“快速排序”方法是最有效的排序方法之一。它是把数组不断的分成更小的数组,直到变成单元素数组。首先把数据分成两部分,一部分的值都小于另一部分的值。这个过程一直持续到数组完全排好序为止。

其函数原型如下所示:

void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));

总共有四个参数:

  • 第一个参数_Base – 指向要排序的数组的第一个元素的指针。
  • 第二个参数 _NumOfElements – 由 base 指向的数组中元素的个数。
  • 第三个参数 _SizeOfElements – 数组中每个元素的大小,以字节为单位。
  • 第四个参数 _PtFuncCompare-- 用来比较两个元素的函数。这个是指向函数的指针,它有两个参数,参数类型都是 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( )来进行比较。

相关文章