网站开发企业标准,潍坊免费自助建站模板,wordpress调用百度地图,江苏省建设集团有限公司网站目录#xff1a;
1.qsort介绍
2.使⽤qsort函数 排序 整型数据
3.使⽤qsort函数 排序 结构体数据
4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数#xff0c; 它可以对指定数组#xff08;包括字符串#xff0c;二维数组#x… 目录
1.qsort介绍
2.使⽤qsort函数 排序 整型数据
3.使⽤qsort函数 排序 结构体数据
4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数 它可以对指定数组包括字符串二维数组结构体等进行排序。
头文件:stdlib.h
qsort函数原型
void qsort(void *base, //指针指向的是待排序的数组的第一个元素size_t num, //是base指向的待排序数组的元素个数size_t size, //base指向的待排序数组的元素的大小字节数int (*compar)(const void *, const void *) //函数指针);
compar参数是qsort函数排序的核心内容它指向一个比较两个元素的函数注意两个形参必须是const void *型同时在调用compar 函数compar实质为函数指针这里称它所指向的函数也为compar时传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。 如果compar返回值小于0 0那么p1所指向元素会被排在p2所指向元素的前面 。如果compar返回值等于0 0那么p1所指向元素与p2所指向元素的顺序不变 。如果compar返回值大于0 0那么p1所指向元素会被排在p2所指向元素的后面 。
因此如果想让qsort()进行从小到大升序排序 那么一个通用的compar函数可以写成这样
int compare (const void * a, const void * b){if ( *(MyType*)a *(MyType*)b )return -1;if ( *(MyType*)a *(MyType*)b )return 0;if ( *(MyType*)a *(MyType*)b ) return 1;}
如果你要将MyType换成实际数组元素的类型。 可以
//升序排序int compare (const void * a, const void * b){return ( *(int*)a - *(int*)b );//强制类型转换后进行访问}//降序排列int compare (const void * a, const void * b){return ( *(int*)b - *(int*)a );}
1.使⽤qsort函数 排序整型数据 2.使⽤qsort排序 结构体数据
#include stdio.h
#include stdlib.h
#include string.h
struct Stu //学⽣
{char name[20];//名字int age;//年龄
};//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)-age - ((struct Stu*)e2)-age;
}
//结构体变量.成员名
//结构体指针-成员名//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)-name, ((struct Stu*)e2)-name);
}
//strcmp - 是库函数是专⻔⽤来⽐较两个字符串的⼤⼩的//是按照对应字符串中字符的ASCII码值比较的//按照年龄来排序
void test2()
{struct Stu s[] { {zhangsan, 20}, {lisi, 30}, {wangwu, 15} };int sz sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}//按照名字来排序
void test3()
{struct Stu s[] { {zhangsan, 20}, {lisi, 30}, {wangwu, 15} };int sz sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}int main()
{test2();//按照年龄来排序test3();//按照名字来排序return 0;
}
3. qsort函数的模拟实现冒泡排序
使⽤回调函数模拟实现qsort采⽤冒泡的⽅式
#include stdio.hint int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}void swap(void *p1, void * p2, int size)
//交换两个元素//void*的指针 是无具体类型的指针
{ //作用是接收任何类型的地址 int i 0;for (i 0; i size; i){char tmp *((char *)p1 i);*(( char *)p1 i) *((char *) p2 i);*(( char *)p2 i) tmp;}
}
void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{int i 0;int j 0;for (i 0; i count - 1; i){for (j 0; jcount-i-1; j){ //实现升序看 是否0 是否进行交换if (cmp ((char *) base j*size , (char *)base (j 1)*size) 0){ //相当于冒泡排序中的arr[j]与arr[j1]swap(( char *)base j*size, (char *)base (j 1)*size, size);}}}
}int main(){int arr[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);//自制冒泡排序for (i 0; i sizeof(arr) / sizeof(arr[0]); i){printf( %d , arr[i]);//实现升序排列}printf(\n);return 0;
}
分享到这里感谢观看