qsort库函数排序

代码 代码 1012 人阅读 | 0 人回复

<
void*一人喝酒醒,醒把char*,width成单对



quick sort快速排序本函数表白

115148kkkw8zr360p88s1s.png

用qsort

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct Stu
  4. {
  5.         char name[20];
  6.         int age;
  7. };
  8. int cmp_int(const void* e1, const void* e2)
  9. {
  10.         return *(int*)e1 - *(int*)e2;
  11. }
  12. int cmp_float(const void* e1, const void* e2)
  13. {
  14.         return (int)(*(float*)e1 - *(float*)e2);
  15. }
  16. //构造体排序有差别排序办法,每一个人的尺度差别,有人是名字,有人是姓名
  17. int cmp_stu_age(const void* e1, const void* e2)
  18. {
  19.         return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
  20. }
  21. int cmp_stu_name(const void* e1, const void* e2)
  22. {
  23.         //名字比力便是比力字符串
  24.         //字符串比力不克不及间接用<>=去比力,该当用strcmp去比力
  25.         return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
  26. }
  27. void test_int()
  28. {
  29.         int arr[10] = { 0,5,6,3,5,9,6,5,3,9 };
  30.         int sz = sizeof(arr) / sizeof(arr[0]);
  31.         qsort(arr, sz, sizeof(arr[0]), cmp_int);
  32.         int i = 0;
  33.         for (i = 0; i < sz; i++)
  34.         {
  35.                 printf("%2d ", arr[i]);
  36.         }
  37.         printf("\n");
  38. }
  39. void test_float()
  40. {
  41.         float arr[10] = { 0.0,5.0,6.0,3.0,5.1,9.0,6.3,5.6,3.3,9.5 };
  42.         int sz = sizeof(arr) / sizeof(arr[0]);
  43.         qsort(arr, sz, sizeof(arr[0]), cmp_float);
  44.         int i = 0;
  45.         for (i = 0; i < sz; i++)
  46.         {
  47.                 printf("%f ", arr[i]);
  48.         }
  49.         printf("\n");
  50. }
  51. void test_stu_age()
  52. {
  53.         struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  54.         int sz = sizeof(s) / sizeof(s[0]);
  55.         qsort(s, sz, sizeof(s[0]), cmp_stu_age);
  56.         int i = 0;
  57.         for (i = 0; i < sz; i++)
  58.         {
  59.                 printf("%s  ", (&s[i])->name);
  60.                 printf("%d  ", (&s[i])->age);
  61.         }
  62.         printf("\n");
  63. }
  64. void test_stu_name()
  65. {
  66.         struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  67.         int sz = sizeof(s) / sizeof(s[0]);
  68.         qsort(s, sz, sizeof(s[0]), cmp_stu_name);
  69.         int i = 0;
  70.         for (i = 0; i < sz; i++)
  71.         {
  72.                 printf("%s  ", (&s[i])->name);
  73.                 printf("%d  ", (&s[i])->age);
  74.         }
  75.         printf("\n");
  76. }
  77. int main()
  78. {
  79.         test_int();
  80.         test_float();
  81.         test_stu_age();
  82.         test_stu_name();
  83.         return 0;
  84. }
复造代码
115148yzxqkuua8lvqv84u.png

普通到了那里必定念本人写个qsort,因而我们仿写一个为BubbleSort

115148ufg0dlvjrzjgf9vv.png

标致的地方void全能规范战char*,字宽width的结合反击

115149m6z6j5m4kmtpc49q.png

115149px3h273nnk2gdh12.png

用BubbleSort

  1. #include<stdio.h>
  2. struct Stu
  3. {
  4.         char name[20];
  5.         int age;
  6. };
  7. //本人写一个全能交流函数
  8. void Swap(char* buf1, char* buf2,int width)
  9. {
  10.         size_t i = 0;
  11.         for (i = 0; i < width; i++)
  12.         {
  13.                 char tmp = *buf1;
  14.                 *buf1 = *buf2;
  15.                 *buf2 = tmp;
  16.                 buf1++;
  17.                 buf2++;
  18.         }
  19. }
  20. //本人写一个冒泡函数,利用回调函数完成一个通用的冒泡排序函数
  21. BubbleSort(void* base, int num, size_t width, int (*cmp)(const void* e1, const void* e2))
  22. {
  23.         int i = 0;
  24.         //趟数
  25.         for (i = 0; i < num - 1; i++)
  26.         {
  27.                 //比力的对数
  28.                 int j = 0;
  29.                 for (j = 0; j < num - 1 - i; j++)
  30.                 {
  31.                         if (cmp((char*)base+j*width,(char*)base+(j+1)*width) > 0)
  32.                         {
  33.                                 //交流
  34.                                 Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
  35.                         }
  36.                 }
  37.         }
  38. }
  39. int cmp_int(const void* e1, const void* e2)
  40. {
  41.         return *(int*)e1 - *(int*)e2;
  42. }
  43. int cmp_float(const void* e1, const void* e2)
  44. {
  45.         return (int)(*(float*)e1 - *(float*)e2);
  46. }
  47. int cmp_stu_age(const void* e1, const void* e2)
  48. {
  49.         return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
  50. }
  51. int cmp_stu_name(const void* e1, const void* e2)
  52. {
  53.         //名字比力便是比力字符串
  54.         //字符串比力不克不及间接用<>=去比力,该当用strcmp去比力
  55.         return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
  56. }
  57. void test_int()
  58. {
  59.         int arr[10] = { 0,5,6,3,5,9,6,5,3,9 };
  60.         int sz = sizeof(arr) / sizeof(arr[0]);
  61.         BubbleSort(arr, sz, sizeof(arr[0]), cmp_int);
  62.         int i = 0;
  63.         for (i = 0; i < sz; i++)
  64.         {
  65.                 printf("%2d ", arr[i]);
  66.         }
  67.         printf("\n");
  68. }
  69. void test_float()
  70. {
  71.         float arr[10] = { 0.0,5.0,6.0,3.0,5.1,9.0,6.3,5.6,3.3,9.5 };
  72.         int sz = sizeof(arr) / sizeof(arr[0]);
  73.         BubbleSort(arr, sz, sizeof(arr[0]), cmp_float);
  74.         int i = 0;
  75.         for (i = 0; i < sz; i++)
  76.         {
  77.                 printf("%f ", arr[i]);
  78.         }
  79.         printf("\n");
  80. }
  81. void test_stu_age()
  82. {
  83.         struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  84.         int sz = sizeof(s) / sizeof(s[0]);
  85.         BubbleSort(s, sz, sizeof(s[0]), cmp_stu_age);
  86.         int i = 0;
  87.         for (i = 0; i < sz; i++)
  88.         {
  89.                 printf("%s  ", (&s[i])->name);
  90.                 printf("%d  ", (&s[i])->age);
  91.         }
  92.         printf("\n");
  93. }
  94. void test_stu_name()
  95. {
  96.         struct Stu s[3] = { {"zhuangsan",20},{"lisi",21},{"wangwu",10} };
  97.         int sz = sizeof(s) / sizeof(s[0]);
  98.         BubbleSort(s, sz, sizeof(s[0]), cmp_stu_name);
  99.         int i = 0;
  100.         for (i = 0; i < sz; i++)
  101.         {
  102.                 printf("%s  ", (&s[i])->name);
  103.                 printf("%d  ", (&s[i])->age);
  104.         }
  105.         printf("\n");
  106. }
  107. int main()
  108. {
  109.         test_int();
  110.         test_float();
  111.         test_stu_age();
  112.         test_stu_name();
  113.         return 0;
  114. }
复造代码
115149vdpz0f7yfe77sjdd.png


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则