网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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]); } }
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-GjTLnU4R-1715739587458)]
[外链图片转存中…(img-Qa0O6KR5-1715739587458)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!