C语言篇 + 指针进阶练习 + qsort模拟实现(回调函数思想) + 指针和数组笔试

闲聊 闲聊 1366 人阅读 | 0 人回复

<
145720iy0jz89kfww90jo8.jpg


目次



媒介

  qsort(quicksort)按照您给的比力函数给一个数组快速排序,是经由过程指针挪动完成排序功用,闭于qsort的模拟完成,本次正在底层的利用的排序算法是利用的冒泡排序,那末便先去理解一下冒泡排序吧,别的做为C/C++法式员我们更该当透辟天来大白指针战数组,那里我筹办了几讲年夜题,内乱容会很超卓,等候您的面赞
冒泡排序

  1、比力相邻的元素。假如第一个比第两个年夜,便交流他们两个。
2、对每对相邻元素做一样的事情,从开端第一对到末端的最初一对。正在那一面,最初的元素该当会是最年夜的数。
3、针对一切的元素反复以上的步调,除最初一个。
4、连续每次对愈来愈少的元素反复上里的步调,曲到出有任何一对数字需求比力。
145721ghrceuv8jhchpt1v.gif

  1. /* 挨印 */
  2. void print(int arr[],int sz)
  3. {
  4.         for (int i = 0; i < sz; i++)
  5.         {
  6.                 printf("%d ",arr[i]);
  7.         }
  8.         printf("\n");
  9. }
  10. /* 交流 */
  11. void Swap(int *n1,int *n2)
  12. {
  13.         int tmp = *n1;
  14.         *n1 = *n2;
  15.         *n2 = tmp;
  16. }
  17. /* 冒泡算法 */
  18. void bubble_sort(int arr[], int sz)
  19. {
  20.         int i = 0;
  21.         for (i = 0; i < sz - 1; i++)
  22.         {
  23.                 int j = 0;
  24.                 for (j = 0; j < sz - 1 - i; j++)
  25.                 {
  26.                         if (arr[j] > arr[j + 1])
  27.                         {
  28.                                 Swap(&arr[j],&arr[j + 1]);
  29.                         }
  30.                 }
  31.         }
  32. }
  33. int main()
  34. {
  35.         int arr[10] = {9,8,7,6,5,4,3,2,1,0};
  36.         int sz = sizeof(arr) / sizeof(arr[0]);
  37.         bubble_sort(arr,sz);
  38.         print(arr,sz);
  39.         return 0;
  40. }
复造代码
pstrong以上的解说各人对冒泡排序该当有了一个明晰的认知了,接下去进进我们的主题/strong/p h1a id="qsort_61"/a理解qsort/h1 p
img src="https://img-blog.csdnimg.cn/af9829b7c6f54186b4798d59cbd8d3e6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASVTojqvmiY7nibk=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="正在那里插进图片形貌" /
br / strongcompare利用文档/strongbr /
img src="https://img-blog.csdnimg.cn/7ea2424def234bb8bf65dc421d6d0e22.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBASVTojqvmiY7nibk=,size_20,color_FFFFFF,t_70,g_se,x_16" alt="正在那里插进图片形貌" /
/p
  1. void qsort(void *base, //待排序的工具,写成void*的情势便于排序随便范例的数据
  2.                    size_t num, //待排序的元素个数
  3.                    size_t width,//一个元素的巨细,单元是字节
  4.                    int(__cdecl *compare)
  5.                    (const void *elem1, const void *elem2))
  6. {
  7. }
  8. >compare指背排序时用去比力两个元素的函数
  9. > void *无详细范例的指针,可以承受随便范例的地点
  10. > 缺陷:不克不及停止运算,不克不及解援用
  11. > 举例:void *p3;
  12. >                 p3++  //err
复造代码
报错疑息
145721ahh4fbsf94kt9x24.png

c言语库qsort的利用

整形范例数据的排序
  1. void print(int arr[],int sz)
  2. {
  3.         for (int i = 0; i < sz; i++)
  4.         {
  5.                 printf("%d ",arr[i]);
  6.         }
  7.         printf("\n");
  8. }
  9. int compare_int(const void *elem1, const void *elem2)
  10. {
  11. /* 降序 */
  12.         return *(int*)elem1 - *(int*)elem2;
  13. /* 降序 */
  14.         //return *(int*)elem2 - *(int*)elem1;
  15. }
  16. int main()
  17. {
  18.         int arr[10] = {9,8,7,6,5,4,3,2,1,0};
  19.         int n = sizeof(arr) / sizeof(arr[0]);
  20.         /* 排序 */
  21.         qsort(arr,n,sizeof(arr[0]), compare_int);
  22.         /* 挨印 */
  23.         print(arr, n);
  24.         return 0;
  25. }
复造代码
pstrong浮面型型数据的排序/strong/p blockquote  p那里要提一句,浮面型数据范例会有粗度的丧失,不克不及间接经由过程两个形参值相加后间接返回成果,经由过程干系比力返回契合的整形/p /blockquote
  1. int cmp_double(const void* elem1, const void* elem2)
  2. {
  3.         return ((*(double*)elem1- *(double*)elem2) > 0)? 1:-1;
  4. }
  5. int main()
  6. {
  7.         double a[] = { 1.2,56.4,0.56,456.89,32.4 };
  8.         int sz = sizeof(a) / sizeof(a[0]);
  9.         qsort(a, sz, sizeof(a[0]), cmp_double);
  10.         for (int i = 0; i < sz; i++)
  11.         {
  12.                 printf("%.2f ", a[i]);
  13.         }
  14.        
  15.         return 0;
  16. }
复造代码
pstrong构造体范例数据的排序/strong/p
  1. typedef struct Student
  2. {
  3.         int age;
  4.         char name[20];
  5.         float score;
  6. }Stu;
  7. void print(Stu arr[], int sz)
  8. {
  9.         for (int i = 0; i < sz; i++)
  10.         {
  11.                 printf("%.1f ", arr[i].score);
  12.         }
  13.         printf("\n");
  14. }
  15. int compare_name(const void *elem1, const void *elem2)
  16. {
  17. /* 降序,那里比力的是字符串的少度*/
  18.         return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
  19. }
  20. int compare_age(const void *elem1, const void *elem2)
  21. {
  22. /* 降序 */
  23.         return ((Stu*)elem1)->age - ((Stu*)elem2)->age;
  24. }
  25. float compare_score(const void *elem1, const void *elem2)
  26. {
  27. /* 降序 */
  28.         return ((Stu*)elem1)->score - ((Stu*)elem2)->score;
  29. }
  30. int main()
  31. {
  32.         Stu s[3] = { {18,"zhangsan",99.5},{20,"lisi",66.5},{21,"wangwu",76} };
  33.         int n = sizeof(s) / sizeof(s[0]);
  34.         qsort(s,n,sizeof(s[0]), compare_score);
  35.         print(s, n);
  36.         return 0;
  37. }
复造代码
qsort模拟完成

[code]typedef struct Student{        int age;        char name[20];        float score;}Stu;int compare_name(const void *elem1, const void *elem2){        /* 降序,那里比力的是字符串的少度*/        return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);}/* 输出整形数据 */void print1(int arr[], int sz){        for (int i = 0; i <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

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

本版积分规则