当前位置:   article > 正文

qsort函数(C语言)_c qsort原函数

c qsort原函数

目录

介绍:

不同类型

        struct Stu(对比字符串):

        int:

        char:


介绍:

qsort()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中。函数原型如下:

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

此函数需要四个参数。

 对于比较函数,因比较形式的多量化,所以作者就将比较函数交给书写者自行进行编译书写。(以整数类型数组排序举例)

  1. #include <stdio.h>
  2. #include <stdlib.h >
  3. void print(int sz, int arr[])
  4. {
  5. int i = 0;
  6. for (i = 0; i < sz; i++)
  7. {
  8. printf("%d ", arr[i]);
  9. }
  10. printf("\n");
  11. }
  12. int cmp_int(const void* e1, const void* e2)
  13. {
  14. return (int*)e1 - (int*)e2;
  15. }
  16. int main()
  17. {
  18. int arr[3] = { 3,2,1 };
  19. int sz = sizeof(arr) / sizeof(arr[0]);
  20. qsort(arr, sz, sizeof(arr[0]), cmp_int);
  21. print(sz, arr);
  22. return 0;
  23. }

注:

  • cmp_int即为,为了进行整数数组的排序所进行的函数大小比较。
  • qsort对我们所传入的数据判断,以我们所写的来进行断定。
    int (__cdecl *compare )(const void *elem1, const void *elem2 ) 

        对此,我们知道qsort是一个运用,快排的方式,使得一串数据以低到高,如果,我们需要以高到低呢,这就需要反思维了,我们须知,以低到高,是有与前者大于后者即换,反之不换。那我们就反过来,后者大于前者即换,反之不换。那我们是不是就得到了一串有高到低的数据,于是我们将"e1 - e2";变为"e2 - e1"即可。以上者代码为例,我们将其变为如此即可:

  1. #include <stdio.h>
  2. #include <stdlib.h >
  3. void print(int sz, int arr[])
  4. {
  5. int i = 0;
  6. for (i = 0; i < sz; i++)
  7. {
  8. printf("%d ", arr[i]);
  9. }
  10. printf("\n");
  11. }
  12. int cmp_int(const void* e1, const void* e2)
  13. {
  14. return (int*)e2 - (int*)e1; //重点变化点
  15. } //-------------------------------
  16. int main()
  17. {
  18. int arr[3] = { 3,2,1 };
  19. int sz = sizeof(arr) / sizeof(arr[0]);
  20. qsort(arr, sz, sizeof(arr[0]), cmp_int);
  21. print(sz, arr);
  22. return 0;
  23. }

不同类型

        struct Stu(对比字符串):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Stu
  4. {
  5. char name[20];
  6. int age;
  7. };
  8. int cmp_struct_Stu(const void* e1, const void* e2)
  9. {
  10. return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
  11. }
  12. int main()
  13. {
  14. struct Stu arr[3] = { {"zhangsan", 20},{"lisi", 30},{"wangwu", 10} };
  15. int sz = sizeof(arr) / sizeof(arr[0]);
  16. qsort(arr, sz, sizeof(arr[0]), cmp_int);
  17. int i = 0;
  18. for (i = 0; i < sz; i++)
  19. {
  20. printf("%s,%d ", (arr[i]).name, (arr[i]).age);
  21. }
  22. printf("\n");
  23. return 0;
  24. }

        int:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void print(int sz, int arr[])
  4. {
  5. int i = 0;
  6. for (i = 0; i < sz; i++)
  7. {
  8. printf("%d ", arr[i]);
  9. }
  10. printf("\n");
  11. }
  12. int cmp_int(const void* e1, const void* e2)
  13. {
  14. return (int*)e1 - (int*)e2;
  15. }
  16. int main()
  17. {
  18. int arr[3] = { 3,2,1 };
  19. int sz = sizeof(arr) / sizeof(arr[0]);
  20. qsort(arr, sz, sizeof(arr[0]), cmp_int);
  21. print(sz, arr);
  22. return 0;
  23. }

        char:

  1. #include <stdio.h>
  2. #include <stdlib.h >
  3. int cmp_char(const void* e1, const void* e2)
  4. {
  5. int n = (*(char*)e1 - *(char*)e2);
  6. return (*(char*)e1 - *(char*)e2);
  7. }
  8. void print(int sz, char arr[])
  9. {
  10. int i = 0;
  11. for (i = 0; i < sz; i++)
  12. {
  13. printf("%c ", arr[i]);
  14. }
  15. printf("\n");
  16. }
  17. int main()
  18. {
  19. char arr[3] = { 'b','a','c'};
  20. int sz = sizeof(arr) / sizeof(arr[0]);
  21. qsort(arr, sz, sizeof(arr[0]), cmp_int);
  22. print(sz, arr);
  23. return 0;
  24. }

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

闽ICP备14008679号