c语言qsort的使用及练习

本文详细介绍了qsort函数的基本概念及使用方法,并通过多个实例演示了如何对不同数据类型的数组进行排序,包括int数组、字符串、char数组、double数组以及结构体。此外,还提供了一个qsort的模拟实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.qsort的基本概念

RoutineRequired HeaderCompatibility
qsort<stdlib.h> and <search.h>ANSI, Win 95, Win NT

用法:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

四个参数:
1.void*base: 待排序数组的地址,即数组名
2.size_t num: 数组待排序元素的个数
3.size_t width: 各元素所占字节数
4.int (__cdecl *compare )(const void *elem1, const void *elem2): 自定义的函数指针,用于确定排序的顺序(需要用户自定义一个比较函数),默认排序方式为升序

返回值:

Return ValueDescription
< 0elem1 less than elem2
=0elem1 equivalent to elem2
>0elem1 greater than elem2

二.练习

1.对int数组排序

一道简单排序题,这里用qsort函数实现

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* p1, const void* p2)//形参格式不能改
{ 
	return(*(int*)p2)-(*(int*)p1)); 	    //将数组元素降序排列
	 
	// return((*(int*)p1) - (*(int*)p2);     将数组元素升序排列
 
}
int main()
{
	int a[40], n, i;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	qsort(a, n, sizeof(a[0]), cmp);
	for (i = 0; i < 5; i++)
	{
		printf("%d ", a[i]);
	}

}

2.对字符串排序

字母异位词

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int cmp(const void* p1, const void* p2)
{
	return((*(char*)p1) - (*(char*)p2));
}
bool b(char* s, char* t)
{
	int ls = strlen(s);
	int lt = strlen(t);
	if (ls != lt)
	{
		return false;
	}
	qsort(s, ls, sizeof(s[0]), cmp);
	qsort(t, lt, sizeof(t[0]), cmp);
	if (strcmp(s, t) == 0)
	{
		return true;
	}
}
int main()
{
	char s[40], t[40];
	gets(s);
	gets(t);
	if (b(s, t))
	{
		printf("true");
	}
	else
	{
		printf("false");
	}
	
}

3.对char数组排序

同int数组类型类似,类型转换时转换成char*即可

4.对double数组排序

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* p1, const void* p2)
{
	double* a = (double*)p1;
	double* b = (double*)p2;
	return *a > * b ? 1 : -1;
}
int main()
{
	double a[40];
	qsort(a, 40, sizeof(a[0]), cmp);
}

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

5.对结构体排序

#include<stdio.h>
struct stu
{
	char name[20];
	int age;
};
int cmp_by_age(const void* e1, const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
void test2()
{
	struct stu arr[] = { {"张三",25},{"李四",20},{"王五",22} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_by_age);
}
int main()
{
	test2();
}

三.模拟实现

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
void _swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*e1,const void*e2))
{
	size_t i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			//相邻2个元素的比较
			//base[j] base[j+1] 
			if (cmp((char*)base+j*width, (char*)base+(j+1)*width)>0)
			{
				//如果不满足顺序就交换
				_swap((char*)base + j*width, (char*)base + (j + 1)*width, width);
			}
		}
	}
}
int main()
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr, sz, sizeof(arr[0]), cmp);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值