荣成市建设局网站,用微信小程序连接WordPress,软件项目管理包括哪些内容,做网站后端qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的#xff0c;下面我们打开官网来查看qsort是如何使用的。 这里有四个参数#xff0c;首先base 是至待排序的数组的首元素的地址#xff0c;num 是值这个数组的元素个数#xff0c;size 是指每个元素的大小下面我们打开官网来查看qsort是如何使用的。 这里有四个参数首先base 是至待排序的数组的首元素的地址num 是值这个数组的元素个数size 是指每个元素的大小最后是一个函数指针用来比较两个元素的不同其中这个函数需要有返回值当返回值小于0时p1需要放在p2前面等于0时p1和p2不用改变位置当返回值大于0时p1需要放在p2的后面由此可见这个函数需要我们自己去编写然后通过函数指针来调用。
下面我们来看看qsort的实践效果
#include stdio.h
#include string.h
#include stdlib.htypedef struct Stu
{char name[20];int age;
}Stu;int cmp_array(const void* p1,const void* p2)
{return *(int*)p1 - *(int*)p2;
}int cmp_stu_name(const void* p1, const void* p2)
{return strcmp(((Stu*)p1)-name, ((Stu*)p2)-name);
}int cmp_stu_age(const void* p1, const void* p2)
{return ((Stu*)p1)-age - ((Stu*)p2)-age;
}void PrintArray(int arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i]);}printf(\n);
}void PrintStu(Stu* s, int sz)
{for (int i 0; i sz; i){printf(%s %d, s[i].name, s[i].age);printf(\n);}
}int main()
{Stu s[3] { {zhangsan,18},{lisi,19},{sunwu,15} };int sz sizeof(s) / sizeof(s[0]);int arr[10] { 4,8,5,7,9,6,2,0,1,3 };int sz2 sizeof(arr) / sizeof(arr[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_name);PrintStu(s, sz);printf(\n);qsort(s, sz, sizeof(s[0]), cmp_stu_age);PrintStu(s, sz);printf(\n);qsort(arr, sz2, sizeof(arr[0]), cmp_array);PrintArray(arr, sz2);printf(\n);return 0;
}使用C语言模拟qsort 这里我们使用冒泡排序算法进行排序使用C语言来模拟qsort函数。 首先我们来回顾冒泡排序算法有两个要点一个是排序的趟数另一个是每一趟排序的次数。这里以升序为例
void bubble_sort(int arr[], int sz)
{for (int i 0; i sz - 1; i){for (int 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;}}}
}然后来模拟qsort函数呢首先qsort函数几乎对任何数据都可以排序所以我们的bubble_sort函数要做出相应调整然后设计形参呢对任何数据进行排序也就是说数据的类型和大小都是不确定的这样的话我们可以使用size_t来作为数据类型用void来接收不同类型的指针实在不会的我们可以参考qsort 函数来设计的。 void base 接收待排序的首元素的地址size_t num 和 size_t size 来接收元素个数和元素大小最后就是最重要的函数设计了。
void bubble_sort(void* base, size_t num, size_t size, int (*compar) (const void* p1, const void* p2))
设计好形参我们来考虑一下函数的主体部分首先趟数是不改变的每趟的次数也不用改变毕竟我们还是使用冒泡排序算法这样的话还有最后一个就是if这个判断语句应为我们无法直接通过像上面一样对两个数进行直接比较我们需要调用函数来进行比较也就是compar函数。
那有个问题我们如何来写compar 函数的指针呢这个指针不能大也不能小否则就无法准确比较或者会产生越界行为这样我们可以使用char* 为什么呢首先我们需要两个两个数据来进行一一比较这样我们需要知道准确的地址必须是恰好指向每个元素的地址而char 刚好就是一个字节只要准确地进行指针加法运算就能得到这个元素地地址。
if (compar((char*)base j * size, (char*)base (j 1) * size) 0)
还有个问题我们怎么交换数据呢其实和上面的理由差不多由于数据的类型不同他们的大小也不同。这时我们可以使用char 因为char 是最小的数据类型了也就是一个字节无论数据是几个字节都是char 的倍数也就是说都可以用一个字节的倍数来表示这样的话我们只需要知道数据类型的大小size) 就可以来通过循环遍历来一个字节一个字节来进行进行交换就可以了,我们可以封装一个函数swap。
void swap(char* p1, char* p2, size_t size)
{int i 0;while (i size){char tmp *(p1 i);*(p1 i) *(p2 i);*(p2 i) tmp;i;}
}那么我们最后得到的bubble_sort函数如下
void bubble_sort(void* base, size_t num, size_t size, int (*compar) (const void* p1, const void* p2))
{for (int i 0; i num - 1; i){for (int j 0; j num - 1 - i; j){if (compar((char*)base j * size, (char*)base (j 1) * size) 0){swap((char*)base j * size, (char*)base (j 1) * size);}}}
}我们来演练一下看看效果是不是和qsort有着一样的效果
代码如下
#include stdio.h
#include string.htypedef struct Stu
{char name[20];int age;
}Stu;int cmp_array(const void* p1,const void* p2)
{return *(int*)p1 - *(int*)p2;
}int cmp_stu_name(const void* p1, const void* p2)
{return strcmp(((Stu*)p1)-name, ((Stu*)p2)-name);
}int cmp_stu_age(const void* p1, const void* p2)
{return ((Stu*)p1)-age - ((Stu*)p2)-age;
}void PrintArray(int arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i]);}printf(\n);
}void PrintStu(Stu* s, int sz)
{for (int i 0; i sz; i){printf(%s %d, s[i].name, s[i].age);printf(\n);}
}void swap(char* p1, char* p2, size_t size)
{int i 0;while (i size){char tmp *(p1 i);*(p1 i) *(p2 i);*(p2 i) tmp;i;}
}void bubble_sort(void* base, size_t num, size_t size, int (*compar) (const void* p1, const void* p2))
{for (int i 0; i num - 1; i){for (int j 0; j num - 1 - i; j){if (compar((char*)base j * size, (char*)base (j 1) * size) 0){swap((char*)base j * size, (char*)base (j 1) * size, size);}}}
}int main()
{Stu s[3] { {zhangsan,18},{lisi,19},{sunwu,15} };int sz sizeof(s) / sizeof(s[0]);int arr[10] { 4,8,5,7,9,6,2,0,1,3 };int sz2 sizeof(arr) / sizeof(arr[0]);bubble_sort(s, sz, sizeof(s[0]), cmp_stu_name);PrintStu(s, sz);printf(\n);bubble_sort(s, sz, sizeof(s[0]), cmp_stu_age);PrintStu(s, sz);printf(\n);bubble_sort(arr, sz2, sizeof(arr[0]), cmp_array);PrintArray(arr, sz2);printf(\n);return 0;
}