目录
权威定义

分析:qsort是一个库函数,头文件#include
函数类型 void,
qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*))
有四个参数:
(void*)起始元素地址(int)元素个数(int)每个元素字节数,int cmp(void*p1,void*p2)
其中规定cmp函数一定是int类型,两个参数为void*类型
补充说明void*
他是一个垃圾桶,什么类型都可以接受,最初设计的时候,qsort的作用排序任意类型,所以void*最合适,cmp函数的参数也是,但是在自定义cmp函数,经常要对p1解引用,或者更改
但是void*不可以解引用,不可以p++
所以一般需要强制类型转换成所需
cmp函数的返回值:0,-1,1
0代表比较的两个数据相等,1表示前一个更大,-1反之
整型排序一般熟知有冒泡排序,快速排序,插入排序,选择排序,堆排序
今天介绍一下冒泡排序新思路
- //1.整型
- //类似qsort的思想,把传统冒泡排序改造,排序整型类型的数据
- #include
- void Swap(char* x, char* y,int width)
- {
- for (int i = 0; i < width; ++i)
- {
- char tmp = *x;
- *x = *y;
- *y = tmp;
- x++; y++;
- }
- }
-
- int cmp_int(const void* e1, const void* e2)
- {
- return ( * (int*)e1 - *(int*)e2); //升序排列
- //return (* (int*)e2 - *(int*)e1); //降序排列
- }
-
- void bubble_sort(void* base, int n, int width, int(*p)(const void* e1, const void* e2))
- {
- for(int i=0;i
-1;i++) - {
- int j = 0;
- for (j = 0; j < n - i - 1; ++j)
- {
- if (p((char*)base + j * width ,(char*)base + (j + 1) * width)>0)
- Swap( (char*)base + j * width, (char*)base + (j + 1) * width,width);
- }
-
- }
- }
-
- void print(int* arr, int n)
- {
- for (int i = 0; i < n; i++)
- printf("%d ", arr[i]);
- }
-
- int main()
- {
- //printf("请输入元素个数\n"); //可以自己选择给什么数字排序
- //int n = 0; scanf("%d", &n); //输入元素个数
- //int arr[]={0};
- //printf("请输入要比较的数字,个数与上次输入要一致\n");
- //for (int i = 0; i < n; ++i) //输入要比较的元素
- //{
- // scanf("%d", &arr[i]);
- //}
- int arr[] = { 1,2,7,4,10,6 }; //规定数字排序
- int n = sizeof(arr) / sizeof(arr[0]);
- bubble_sort(arr, n, sizeof(arr[0]), cmp_int);
- print(arr, n);
- }
- //2.qsort排序各种类型
- //2.1整型
- //int main()
- //{
- // int arr[] = { 1,2,3,77,99 }; //同样可以用上面自己输入的方法,这里简写成给定数组
- // int len = sizeof(arr) / sizeof(arr[0]);
- // qsort(arr, len, sizeof(arr[0]), cmp_int);
- // print(arr, len);
- //}
-
-
- //2.2字符串
- #include
- void print2(char* arr, int n)
- {
- for (int i = 0; i < n; i++)
- {
- printf("%c ", arr[i]);
- }
- }
- int strcmp_sort(const void* e1, const void* e2)
- {
- return (*(char*)e1 - *(char*)e2);
- }
- //int main()
- //{
- // char arr[] = "adcb";
- // int n = strlen(arr);
- // qsort(arr, n, sizeof(arr[0]), strcmp_sort);
- // print2(arr, n);
- //}
-
- //2.3结构体,名字
- struct Leader
- {
- char name[20];
- int high;
- };
-
- int cmp_name(const void* e1, const void* e2)
- {
- return (strcmp(((struct Leader*)e1)->name, ((struct Leader*)e2)->name));
- }
-
- int cmp_age(const void* e1, const void* e2)
- {
- return (((struct Leader*)e1)->high-((struct Leader*)e2)->high);
- }
- int main()
- {
- struct Leader p[] = { { "d",180 }, { "a",170 } };
- int sz= sizeof(p) / sizeof(p[0]);
- qsort(p, sz, sizeof(p[0]), cmp_name); //名字
- qsort(p, sz, sizeof(p[0]), cmp_age);
- }
如果还有不懂欢迎留言,我会及时回复并且详细解释
创作不易,感谢观看![]()