最近在刷PAT时C语言中qsort函数的使用极多,所以在这里总结整理了一下,需要的朋友可以参考下。

C语言中qsort函数的用法实例详解

  • 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。
  • qsort函数包含在<stdlib.h>中
  • qsort函数声明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));

参数说明:

  • base,要排序的数组
  • nmemb,数组中元素的数目
  • size,每个数组元素占用的内存空间,可使用sizeof函数获得
  • compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。

用法实例小结

C语言中的qsort函数包含在<stdlib.h>的头文件里,排序默认都是采用的从小到大排序。

  • (如果要降序排序,只需将return里的a,b反过来写即可。)

一、对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 in[100]; 
 
int cmp( const void *a , const void *b ) 
{ 
  return *(double *)a > *(double *)b ? 1 : -1; 
} 
qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序

  • 结构体
struct node
{
   double one;
   int two;
} s[100];
  • 完整代码
struct node
{
   double one;
   int two;
} s[100];

int cmp( const void *a ,const void *b)
{
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp); 

五、对结构体二级排序

struct node
{
   double one;
   int two;
} s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序 
int cmp( const void *a , const void *b )
{
if((* (node * )a).one != ( * (node * )b).one)
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
else return (* (node * )a).two -( * (node * )b).two;
}
qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

char am = { {"...."}, {"....."}, .....};
//根据字符串首字母排序
int cmp(const void *a, const void *b)  
{  
	return * (char *)a - *(char * )b;  
} 
qsort(a, m, sizeof(char * )  * n, cmp); 


char am = { {"...."}, {"....."}, .....};
//根据字符串长度排序
int cmp(const void *a, const void *b)  
{  
	return strlen((char * )a) > strlen((char * )b) ? 1 : -1;  
} 
qsort(a, m, sizeof(char * )  * n, cmp);


char am = { {"...."}, {"....."}, .....};
//按照结构体中字符串str的字典顺序排序 
int cmp(const void *a, const void *b)
{
	return (strcmp((char *)a, (char *)b));
}
qsort(a, m, sizeof(char * )  * n, cmp);

七、计算几何中求凸包的cmp

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0) return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 
return 1;
else return -1;
}

具体样例

1.int类型数组排序

#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
 } 
int main (){
	int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,
		11, 15, 14, 12, 13, 16, 17, 18, 19, 10};
	qsort(a, L, sizeof(int), cmp);
	for (int i = 0; i < L; i++){
		printf("%d ", a[i]);
	}
 } 

2.double类型数组排序

#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
	return *(double *)a > *(double *)b? 1 : -1;
 } 
int main (){
	double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8, 
		15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};
	qsort(a, L, sizeof(double), cmp);
	for (int i = 0; i < L; i++){
		printf("%.2lf\n", a[i]);
	}
 } 

3.char类型数组排序

#include<stdio.h>
#include<stdlib.h>
#define L 20
int cmp(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
 } 
int main (){
	char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l',
		'o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};
	qsort(a, L, sizeof(char), cmp);
	for (int i = 0; i < L; i++){
		printf("%c ", a[i]);
	}
 } 

4.字符串进行排序

  • 按首字母排序
#include<stdio.h>
#include<stdlib.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
 } 
int main (){
	char a[L][K] = {
		"rbsgc",
		"jcghse",
		"gfgd",
		"abbbs",
		"bbbvs",
		"cbfgfe",
		"drgafg" ,
		"ewqgrta",
		"ofggd",
		"mbgcv",
	};
	qsort(a, L, sizeof(char) * K, cmp);
	for (int i = 0; i < L; i++){
		printf("%s\n", a[i]);
	}
 } 

  • 按长度排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
	return strlen((char *)a) > strlen((char *)b) ? 1 : -1;
 } 
int main (){
	char a[L][K] = {
		"rbsgc",
		"jcghse",
		"gfgd",
		"abbbs",
		"bbbvs",
		"cbfgfe",
		"drgafg" ,
		"ewqgrta",
		"ofggd",
		"mbgcv",
	};
	qsort(a, L, sizeof(char) * K, cmp);
	for (int i = 0; i < L; i++){
		printf("%s\n", a[i]);
	}
 } 
  • 按字典顺序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp(const void *a, const void *b)
{
	return strcmp((char * )a, (char *)b);
 } 
int main (){
	char a[L][K] = {
		"rbsgc",
		"jcghse",
		"gfgd",
		"abbbs",
		"bbbvs",
		"cbfgfe",
		"drgafg" ,
		"ewqgrta",
		"ofggd",
		"mbgcv",
	};
	qsort(a, L, sizeof(char) * K, cmp);
	for (int i = 0; i < L; i++){
		printf("%s\n", a[i]);
	}
 } 

5.结构体二级排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
typedef struct node {
 	double first;
 	int numb;
 }node;
int cmp(const void *a, const void *b)
{
	if((* (node *)a).first != ( * (node *)b).first)
	return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1;
	else return (* (node * )a).numb -( * (node * )b).numb;

 } 
int main (){
	node arr[L] = {
		1.0, 1,
		2.0, 2,
		1.1, 3,
		2.1, 4,
		3.5, 5,
		1.0, 6,
		1.1, 7,
		5.1, 8,
		5.0, 9,
		3.6, 10,
		
	};
	qsort(arr, L, sizeof(node), cmp);
	for (int i = 0; i < L; i++){
		printf("%.2lf %d\n", arr[i].first, arr[i].numb);
	}
 } 

参考博文