当前位置: 首页 > news >正文

安徽设计网站建设百度公司招聘信息

安徽设计网站建设,百度公司招聘信息,怎么隐藏字体wordpress,开发小程序服务热线各位CSDN的uu们你们好呀,今天小雅兰的内容还是我们的深度剖析指针呀,上篇博客我们学习了回调函数这个知识点,但是没有写完,因为:小雅兰觉得qsort值得单独写出来!!!好啦,就…

各位CSDN的uu们你们好呀,今天小雅兰的内容还是我们的深度剖析指针呀,上篇博客我们学习了回调函数这个知识点,但是没有写完,因为:小雅兰觉得qsort值得单独写出来!!!好啦,就让我们进入指针的世界吧

qsort是一个库函数,是用来排序的库函数,使用的是快速排序的方法 

quicksort

我们先来复习一下之前所学习过的一种算法——冒泡排序

冒泡排序——“C”_认真学习的小雅兰.的博客-CSDN博客

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序的过程int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//排序//使用冒泡排序的算法,来排序int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//打印print_arr(arr, sz);return 0;
}

但是,这个算法最大的缺点就是只能排序整型,如果未来要排序浮点数呢?如果未来要排序一些字符串呢?结构体呢?那么,这个函数就搞不定了,仅仅能排序固定类型的数据

 qsort的好处:

  • 现成的
  • 可以排序任意类型的数据

 void qsort( void *base,//指向了待排序数组的第一个元素

                     size_t num,//待排序的元素个数

                     size_t width,//每个元素的大小,单位是字节

                     int (__cdecl *compare )(const void *elem1, const void *elem2 )

                     //函数指针

                     //指向一个函数,这个函数可以比较两个元素的大小

                   );

qsort是可以排序任意类型的数据的

  1. 比较两个整数的大小,>  <  =
  2. 比较两个字符串,strcmp
  3. 比较两个结构体数据(学生:张三、李四),指定比较的标准,拿什么比较? 

int a=10;

void * p=&a;

//void * ——无具体类型的指针,所以它可以接收任何类型的地址

//*p;//err void*的指针不能使用解引用操作符

//p++;//err

下面,我们来使用一下qsort函数:

#include<stdio.h>
#include<stdlib.h>
//qsort函数的使用者提供这个函数
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
test1()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//使用qsort来排序整型数组,这里就要提供一个比较函数,这个比较函数能够比较2个整数的大小//qsort默认是排成升序的qsort(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}
int main()
{test1();return 0;
}

 

 qsort这个库函数是不是很神奇呢?下面还有更加神奇的!!!

我们来测试一下qsort排序结构体数据

#include<stdio.h>
#include<stdlib.h>
//qsort函数的使用者提供这个函数
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
struct Stu
{char name[20];int age;
};
int cmp_stu_by_age(const void* p1, const void* p2)
{return ((struct  Stu*)p1)->age - ((struct Stu*)p2)->age;
}
void print(struct Stu* ps, int sz)
{int i = 0;for (i = 0; i < 3; i++){printf("%d\n", ps[i].age);}
}
void test2()
{struct Stu s[] = { {"zhangsan",30},{"lisi",25 }, { "wangwu",50 } };int sz = sizeof(s) / sizeof(s[0]);//测试按照年龄来排序qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);print(s, sz);
}
int main()
{test2();return 0;
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{char name[20];int age;
};
int cmp_stu_by_name(const void* p1, const void* p2)
{return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
void print(struct Stu *ps, int sz)
{int i = 0;for (i = 0; i < 3; i++){printf("%s\n", ps[i].name);}
}
void test2()
{struct Stu s[] = { {"zhangsan",30},{"lisi",25},{"wangwu",50} };int sz = sizeof(s) / sizeof(s[0]);//测试按照名字来排序qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);print(s, sz);
}
int main()
{test2();return 0;
}

qsort底层是快速排序,但是小雅兰还没有学习快速排序的思想,所以暂时还不能之间实现qsort,所以使用冒泡排序的思想来实现一个类似于qsort这个功能的冒泡排序函数bubble_sort

使用回调函数,模拟实现qsort(采用冒泡的方式)。

测试函数:

void test3()
{int arr[] = { 3,1,5,2,4,9,8,6,7,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}

主函数:

int main()
{test3();return 0;
}

模拟实现的bubble_sort()函数:

//假设排序为升序
//希望这个bubble_sort函数可以排序任意类型的数据
void bubble_sort(void* base, size_t num, size_t width, int(*cmp)(const void* p1, const void* p2))
{//base 待排序数组的第一个元素//元素个数和元素个数的大小不可能是负数,所以是size_t类型//函数指针//要确定趟数size_t i = 0;for (i = 0; i < num - 1; i++){//一趟冒泡排序的过程size_t j = 0;int flag = 1;//假设已经有序了//标记变量for (j = 0; j < num - 1 - i ; j++){//两个相邻的元素比较//arr[j] arr[j+1]if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//强制类型转换为char*//因为base为void类型,不能之间进行加减乘除,所以强制类型转换,但是又不能转换为int*,因为不一定就排序整型数组flag = 0;//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}if (flag == 1){break;}}
}

在bubble_sort()函数中,调用了自定义的函数Swap,是用来交换元素的:

int cmp_int(const void* p1, const void* p2)//不知道要排序什么类型的数组,所以用void*
{return *(int*)p1 - *(int*)p2;
}
void Swap(char* buf1, char* buf2,int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}

打印函数:

void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}

 

完整代码如下所示:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int cmp_int(const void* p1, const void* p2)//不知道要排序什么类型的数组,所以用void*
{return *(int*)p1 - *(int*)p2;
}
void Swap(char* buf1, char* buf2,int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}
//假设排序为升序
//希望这个bubble_sort函数可以排序任意类型的数据
void bubble_sort(void* base, size_t num, size_t width, int(*cmp)(const void* p1, const void* p2))
{//base 待排序数组的第一个元素//元素个数和元素个数的大小不可能是负数,所以是size_t类型//函数指针//要确定趟数size_t i = 0;for (i = 0; i < num - 1; i++){//一趟冒泡排序的过程size_t j = 0;int flag = 1;//假设已经有序了//标记变量for (j = 0; j < num - 1 - i ; j++){//两个相邻的元素比较//arr[j] arr[j+1]if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0){//强制类型转换为char*//因为base为void类型,不能之间进行加减乘除,所以强制类型转换,但是又不能转换为int*,因为不一定就排序整型数组flag = 0;//交换Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}if (flag == 1){break;}}
}
void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
void test3()
{int arr[] = { 3,1,5,2,4,9,8,6,7,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}
int main()
{test3();return 0;
}


 好啦,小雅兰玩转的qsort就到这里啦,这篇博客难度很大,确实花了小雅兰很多时间,未来还要继续加油呀!!!

 

 

 

 

http://www.yidumall.com/news/2835.html

相关文章:

  • 备案个人可以做视频网站seopc流量排名官网
  • 所见即所得的网站开发软件深圳做网站公司
  • 千博企业网站系统网页查询
  • dede做网站济南最新消息
  • 做网站南宁如何做好口碑营销
  • 模版网站后期可以更换图片吗网络优化器免费
  • 网站委托建设运营协议seo的优化技巧有哪些
  • 怎么创建一个公司网站网站网络排名优化方法
  • 怎么做网上直营店网站网站是怎么建立起来的
  • 招商网站建设解决方案河南网站推广
  • 自助商城网站建设查权重的软件
  • c 网站开发框架有搜索网站有哪几个
  • 直播交友app开发厦门seo总部电话
  • 做网站编写seo快速排名软件方案
  • 推广网站怎样做百度排名怎么做
  • 网站建设百度优化北京seo课程培训
  • dz论坛如何做网站地图线在成都网站推广公司
  • 网站内容建设和管理系统营销必备十大软件
  • 冷色网站百度网盘电脑版
  • 统计网站流量的网站网址服务器查询
  • wordpress设计类网站东莞网站设计排行榜
  • 重庆知道推广网站方法百度竞价排名又叫
  • 电商培训网站广告
  • 哪里有网站可以做动态视频倒计时怎么给公司做网站推广
  • 如何做html网站百度优化推广
  • wordpress博客列表循环播放东莞网站建设优化诊断
  • 重庆观音桥aso优化方案
  • 网络公司排名图seo西安
  • wordpress网站压缩百度一下你就知道移动官网
  • 手机移动端网站怎么做的免费企业网站管理系统