当前位置:   article > 正文

C语言qsort函数的使用以及模拟实现qsort_qsort_s函数的用法

qsort_s函数的用法

目录

(一).qsort函数的使用

1.了解qsort函数

2.qsort排序整型类型的数组

3.qsort排序double类型的数组

4.qsort排序字符类型的数组

 5.qsort排序结构体中的字符串

 6.qsort排序结构体中的整型

(二). 模拟实现qsort函数

思路:

1.主函数

2.bubble_sort函数

3.需要用到的compar函数

4.swap函数

5.运行结果


(一).qsort函数的使用

1.了解qsort函数

 在cplusplus网站上找到qsort函数进去可以看到: 

可以看到其是stdilb库底下的一个函数,它是一个通用的排序函数,原型是:

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

其参数从左到右依次是:

1 .待排序数组首地址 2. 数组中待排序元素数量 3. 各元素的占用空间大小 4. 指向函数的指针

接下来我们进行对qsort的使用。

2.qsort排序整型类型的数组

代码如下:

  1. int cmp_int(const void* p1, const void* p2) //整型
  2. {
  3. return *(int*)p1 - *(int*)p2;
  4. }
  5. int main()
  6. {
  7. int arr[] = { 9,8,7,6,5,4,3,2,1 };//整型
  8. int sz = sizeof(arr) / sizeof(arr[0]);
  9. int width = sizeof(arr[0]);
  10. qsort(arr, sz, width, cmp_int);
  11. for (int i = 0; i < sz; i++)
  12. {
  13. printf("%d ", arr[i]);
  14. }
  15. return 0;
  16. }

其中qsort()中arr代表数组的首地址,sz代表数组中需要排序的元素个数,width代表了每个元素所占空间的大小,cmp_int则是指向cmp_int函数的指针。

运行结果如下:

3.qsort排序double类型的数组

代码如下:

  1. int cmp_double(const void* p1, const void* p2)//double浮点型
  2. {
  3. return *(double*)p1 > *(double*)p2;
  4. }
  5. int main()
  6. {
  7. double doub[] = { 3.24, 5.56, 6.77, 1.34, 4.45, 2.56, 6.78 };
  8. int sz = sizeof(doub) / sizeof(doub[0]);
  9. int width = sizeof(doub[0]);
  10. qsort(doub, sz, width, cmp_double);
  11. for (int i = 0; i < sz; i++)
  12. {
  13. printf("%f ", doub[i]);
  14. }
  15. return 0;
  16. }

注意:

因为qsort参数内的函数指针所指向的函数的返回类型为int,所以对于浮点型数据,不能直接相减然后返回,即:

return *(double*)p1 - *(double*)p2;//错误示范

此时就会出错。

运行结果如下:

4.qsort排序字符类型的数组

代码如下:

  1. int cmp_char(const void* p1, const void* p2)//字符
  2. {
  3. return *(char*)p1 - *(char*)p2;
  4. }
  5. int main()
  6. {
  7. char ch[] = "fedbca";
  8. int sz = sizeof(ch) / sizeof(ch[0]);
  9. int width = sizeof(ch[0]);
  10. qsort(ch, sz, width, cmp_char);
  11. for (int i = 0; i < sz; i++)
  12. {
  13. printf("%c ", ch[i]);
  14. }
  15. return 0;
  16. }

运行结果如下:

 5.qsort排序结构体中的字符串

代码如下:

  1. struct stu
  2. {
  3. char name[20];
  4. int age;
  5. };
  6. int cmp_name(const void* p1, const void* p2)
  7. {
  8. return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
  9. }
  10. int main()
  11. {
  12. struct stu s[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",16} };
  13. int sz = sizeof(s) / sizeof(s[0]);
  14. int width = sizeof(s[0]);
  15. qsort(s, sz, width, cmp_name);
  16. for (int i = 0; i < sz; i++)
  17. {
  18. printf("%s ", s[i].name);
  19. }
  20. return 0;
  21. }

注意:

return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);

在这段代码中,如果将p1强制类型转换成结构体类型的指针后,并没有加括号,那么就会报错:

"->name"的左侧必须指向结构/联合

类似于这样的问题,这是因为优先级的问题,先进行转化,转化完之后再进行->,如果不加括号就不是先进行转化了。

运行结果如下:

 6.qsort排序结构体中的整型

代码如下:

  1. struct stu
  2. {
  3. char name[20];
  4. int age;
  5. };
  6. int cmp_age(const void* p1, const void* p2)
  7. {
  8. return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
  9. }
  10. int main()
  11. {
  12. struct stu s[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",16} };
  13. int sz = sizeof(s) / sizeof(s[0]);
  14. int width = sizeof(s[0]);
  15. qsort(s, sz, width, cmp_age);
  16. for (int i = 0; i < sz; i++)
  17. {
  18. printf("%d ", s[i].age);
  19. }
  20. printf("\n");
  21. return 0;
  22. }

运行结果如下:

(二). 模拟实现qsort函数

思路:

由于现在只学习了较为简单的冒泡排序和二分法排序,所以今天只用冒泡排序来模拟qsort所使用的快速排序算法。

用bubble_sort函数来代替qsort函数,则bubble_sort函数的主体部分应该为冒泡排序算法

1.主函数

  1. int main()
  2. {
  3. //排序整型数组
  4. int arr[] = { 9,8,7,6,5,4,3,2,1 };
  5. int sz = sizeof(arr) / sizeof(arr[0]);
  6. int width = sizeof(arr[0]);
  7. bubble_sort(arr, sz, width, compar);
  8. for (int i = 0; i < sz; i++)
  9. {
  10. printf("%d ", arr[i]);
  11. }
  12. printf("\n");
  13. //排序结构体
  14. struct Stu s[3] = { "zhangsan",18,"lisi",15,"wangwu",19 };
  15. sz = sizeof(s) / sizeof(s[0]);
  16. width = sizeof(s[0]);
  17. bubble_sort(s, sz, width, cmp_by_name);//按照名字排序
  18. for (int i = 0; i < sz; i++)
  19. {
  20. printf("%s\n", s[i].name);
  21. }
  22. bubble_sort(s, sz, width, cmp_by_age);//按照年龄排序
  23. for (int i = 0; i < sz; i++)
  24. {
  25. printf("%d\n", s[i].age);
  26. }
  27. return 0;
  28. }

这里的主函数其实跟使用qsort函数时差不多

2.bubble_sort函数

  1. void bubble_sort(void* base, size_t num, size_t width, int(*compar)(const void* p1, const void* p2))
  2. {
  3. int i = 0;
  4. int j = 0;
  5. for (i = 0; i < num - 1; i++)
  6. {
  7. for (j = 0; j < num - i - 1; j++)
  8. {
  9. //arr[j] > arr[j+1]
  10. if (compar((char*)base + j * width,(char*)base + (j + 1) * width) > 0)
  11. {
  12. swap((char*)base + j * width,(char*)base + (j + 1 )* width,width);
  13. }
  14. }
  15. }
  16. }

因为我们不知道即将传来的数据是哪种类型的,所以我们将数据先转化成最小的char类型,因为传来的参数包括每个元素所占空间的大小,也就是几个字节,所以我们可以每个字节每个字节的对比和交换。

3.需要用到的compar函数

需要用到的compar函数和上面qsort所用到的各个cmp函数是相同的。

4.swap函数

  1. void swap(char* p1,char* p2,size_t width)
  2. {
  3. int i = 0;
  4. for (i = 0; i < width; i++ )
  5. {
  6. char tmp = *p1;
  7. *p1 = *p2;
  8. *p2 = tmp;
  9. p1++;
  10. p2++;
  11. }
  12. }

5.运行结果

 这就是今天的使用qsort函数和模拟实现qsort函数啦!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/387683
推荐阅读
相关标签
  

闽ICP备14008679号