C语言qsort()函数针对:整型、单个字符、字符串、结构体,超详细讲解(2)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

return *b - *a;       // 降序

}


**上面写的这种方法便于大家的理解,其实可以继续化简,使代码更加简洁**



int cmp_int (const void * a,const void b)
{
return * (int * )a-
(int )b; //升序
return * (int * )b-
(int *)a; //降序
}



知识点2:

针对整型数据的排序举例,看代码:

#include <stdlib.h>
#include <stdio.h>
int cmp_int(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;    //升序
}
int main() 
{
	int arr[] = { 1, 3, 6, 2, 4, 8, 7, 10 };
	printf("排序前:");
	int sz = sizeof(arr) / sizeof(arr[0]);  //求出数组的长度
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("%d  ", arr[i]);
	}
	qsort(arr, sz, sizeof(arr[0]), cmp_int);  // 进行排序
	printf("\n排序后:");
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("%d  ", arr[i]);
	}
	return 0;
}

💦 double型

知识点1:

首先写出针对整型的 比较函数: int (*compar)(const void*, const void*)

int cmp_double (const void * a, const void * b)
{
  return *(double *)a > *(double *)b ? 1 : -1;  //升序
  return *(double *)a < *(double *)b ? 1 : -1;  //降序
}

注意:

这里两个浮点数相减但要返回一个整型数,如果按上面做法直接减会丢失小数点部分。所以需另加处理,直接判断大小,如果a大于b,则返回1,否则返回-1。

知识点2:
 针对double型数据的排序举例,看代码:

#include <stdlib.h>
#include <stdio.h>
int cmp_double(const void* a, const void* b)
{
	return *(double*)a > *(double*)b ? 1 : -1;  //升序
}
int main() 
{
	double arr[] = { 1.0, 3.0, 6.0, 2.0, 4.0, 8.0, 7.0, 10.0 };
	printf("排序前:");
	int sz = sizeof(arr) / sizeof(arr[0]);  //求出数组的长度
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("%.2lf  ", arr[i]);
	}
	qsort(arr, sz, sizeof(arr[0]), cmp_double);  //进行排序
	printf("\n排序后:");
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("%.2lf  ", arr[i]);
	}
	return 0;
}

💦字符排序

知识点1:
首先写出针对整型的 比较函数: int (*compar)(const void*, const void*)

int cmp_char(const void *a,const void *b)
{
   return *(char *)a - *(char *)b;  //升序
   return *(char *)a - *(char *)b;  //降序
}

知识点2:

针对double型数据的排序举例,看代码:

#include <stdlib.h>
#include <stdio.h>
int cmp_char(const void* a, const void* b)
{
	return *(char*)a - *(char*)b;    //升序
}
int main() 
{
	char arr[] = { 'b', 'd', 'a', 'c' };
	printf("排序前:");
	int sz = sizeof(arr) / sizeof(arr[0]);  //求出数组的长度
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("%c  ", arr[i]);
	}
	qsort(arr, sz, sizeof(arr[0]), cmp_char);  //进行排序
	printf("\n排序后:");
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
	{
		//printf("");
		printf("%c  ", arr[i]);
	}
	return 0;
}

🍎qsort()函数在字符串中的应用

💦在字符串中按首字母排序

知识点1:
首先写出针对整型的 比较函数: int (*compar)(const void*, const void*)

int cmp_char(const void *a, const void *b)  
{  
  return * (char *)a - *(char * )b;   //升序
}  

针对字符串按首字母的排序举例,看代码:

#include<stdio.h>
#include<stdlib.h>
#define L 10
#define K 10
int cmp_char(const void* a, const void* b)
{
	return *(char*)a - *(char*)b;    //升序
}
int main()
{
	char a[L][K] = {
		"rbsc",
		"jcse",
		"efgd",
		"arbs",
		"bbs",
		"cbfe",
		"dgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv",
	};
	qsort(a, L, sizeof(char) * K, cmp_char);   // 进行排序
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
	return 0;
}

注意:此时先申请一个二维数组,将二维数组的每一行看成一个一维数组,就可以得出,有L个一维数组,每个数组有K个元素。

💦字符串长度排序

知识点1:
首先写出针对整型的 比较函数: int (*compar)(const void*, const void*)

int cmp_char(const void *a, const void *b)
{
	return strlen((char *)a) > strlen((char *)b) ? 1 : -1;  //升序
 }  

注:这里不要用 return strlen((char * )a) - strlen((char * )b) ;

**原因:**1. strlen返回类型为size_t,size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。无符号整型最好不要做四则运算。

2. 这里虽然函数返回int型,会把无符号数转换为整型,但返回结果只在字符串的长度未超过int的范围时正确。这种大范围转小范围要考虑精度损失的问题。

3.这里大家可以看看我之前写的字符串函数:

(358条消息) C语言:常见字符串函数详解初阶(小白一看就懂,让你有一种相见恨晚的感觉哦!!!)_sunny-ll的博客-CSDN博客 C语言:常见字符串函数详解初阶(小白一看就懂,让你有一种相见恨晚的感觉哦!!!)_sunny-ll的博客-CSDN博客")

针对字符串长度排序举例,看代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp_char(const void *a, const void *b)
{
	return strlen((char *)a) > strlen((char *)b) ? 1 : -1;  //升序
 } 
int main ()
{
	char a[L][K] = {
		"rbsc",
		"jcsse",
		"efgdsd",
		"arbs",
		"bbs",
		"cbfefaa",
		"dgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv312",
	};
	qsort(a, L, sizeof(char) * K, cmp_char);
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
 } 

💦字符串按字典顺序排序

知识点1:

首先写出针对整型的 比较函数: int (*compar)(const void*, const void*)

int cmp_char(const void *a, const void *b)
{
	return strcmp((char * )a, (char *)b);  //升序
} 

针对字符串字典顺序排序举例,看代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int cmp_char(const void *a, const void *b)
{
	return strcmp((char * )a, (char *)b);   //升序
 } 
int main ()
{
	char a[L][K] = {
		"rbsc",
		"jcsse",
		"afgdsd",
		"arbs",
		"abs",
		"cbfefaa",
		"cgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv312",
	};
	qsort(a, L, sizeof(char) * K, cmp_char);
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
 } 

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-GjTLnU4R-1715739587458)]
[外链图片转存中…(img-Qa0O6KR5-1715739587458)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值