赞
踩
目录
在cplusplus网站上找到qsort函数进去可以看到:
可以看到其是stdilb库底下的一个函数,它是一个通用的排序函数,原型是:
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
其参数从左到右依次是:
1 .待排序数组首地址 2. 数组中待排序元素数量 3. 各元素的占用空间大小 4. 指向函数的指针
接下来我们进行对qsort的使用。
代码如下:
- int cmp_int(const void* p1, const void* p2) //整型
- {
- return *(int*)p1 - *(int*)p2;
- }
-
- int main()
- {
- int arr[] = { 9,8,7,6,5,4,3,2,1 };//整型
- int sz = sizeof(arr) / sizeof(arr[0]);
- int width = sizeof(arr[0]);
- qsort(arr, sz, width, cmp_int);
- for (int i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
其中qsort()中arr代表数组的首地址,sz代表数组中需要排序的元素个数,width代表了每个元素所占空间的大小,cmp_int则是指向cmp_int函数的指针。
运行结果如下:
代码如下:
- int cmp_double(const void* p1, const void* p2)//double浮点型
- {
- return *(double*)p1 > *(double*)p2;
- }
-
-
- int main()
- {
- double doub[] = { 3.24, 5.56, 6.77, 1.34, 4.45, 2.56, 6.78 };
- int sz = sizeof(doub) / sizeof(doub[0]);
- int width = sizeof(doub[0]);
- qsort(doub, sz, width, cmp_double);
- for (int i = 0; i < sz; i++)
- {
- printf("%f ", doub[i]);
- }
- return 0;
- }
注意:
因为qsort参数内的函数指针所指向的函数的返回类型为int,所以对于浮点型数据,不能直接相减然后返回,即:
return *(double*)p1 - *(double*)p2;//错误示范
此时就会出错。
运行结果如下:
代码如下:
- int cmp_char(const void* p1, const void* p2)//字符
- {
- return *(char*)p1 - *(char*)p2;
- }
-
- int main()
- {
- char ch[] = "fedbca";
- int sz = sizeof(ch) / sizeof(ch[0]);
- int width = sizeof(ch[0]);
- qsort(ch, sz, width, cmp_char);
- for (int i = 0; i < sz; i++)
- {
- printf("%c ", ch[i]);
- }
- return 0;
- }
运行结果如下:
代码如下:
- struct stu
- {
- char name[20];
- int age;
- };
-
- int cmp_name(const void* p1, const void* p2)
- {
- return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
- }
-
- int main()
- {
- struct stu s[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",16} };
- int sz = sizeof(s) / sizeof(s[0]);
- int width = sizeof(s[0]);
- qsort(s, sz, width, cmp_name);
- for (int i = 0; i < sz; i++)
- {
- printf("%s ", s[i].name);
- }
- return 0;
- }
注意:
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
在这段代码中,如果将p1强制类型转换成结构体类型的指针后,并没有加括号,那么就会报错:
"->name"的左侧必须指向结构/联合
类似于这样的问题,这是因为优先级的问题,先进行转化,转化完之后再进行->,如果不加括号就不是先进行转化了。
运行结果如下:
代码如下:
- struct stu
- {
- char name[20];
- int age;
- };
-
- int cmp_age(const void* p1, const void* p2)
- {
- return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
- }
-
- int main()
- {
- struct stu s[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",16} };
- int sz = sizeof(s) / sizeof(s[0]);
- int width = sizeof(s[0]);
- qsort(s, sz, width, cmp_age);
- for (int i = 0; i < sz; i++)
- {
- printf("%d ", s[i].age);
- }
- printf("\n");
- return 0;
- }
运行结果如下:
由于现在只学习了较为简单的冒泡排序和二分法排序,所以今天只用冒泡排序来模拟qsort所使用的快速排序算法。
用bubble_sort函数来代替qsort函数,则bubble_sort函数的主体部分应该为冒泡排序算法
- int main()
- {
- //排序整型数组
- int arr[] = { 9,8,7,6,5,4,3,2,1 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- int width = sizeof(arr[0]);
- bubble_sort(arr, sz, width, compar);
- for (int i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
-
- //排序结构体
- struct Stu s[3] = { "zhangsan",18,"lisi",15,"wangwu",19 };
- sz = sizeof(s) / sizeof(s[0]);
- width = sizeof(s[0]);
- bubble_sort(s, sz, width, cmp_by_name);//按照名字排序
- for (int i = 0; i < sz; i++)
- {
- printf("%s\n", s[i].name);
- }
-
- bubble_sort(s, sz, width, cmp_by_age);//按照年龄排序
- for (int i = 0; i < sz; i++)
- {
- printf("%d\n", s[i].age);
- }
- return 0;
- }
这里的主函数其实跟使用qsort函数时差不多
- void bubble_sort(void* base, size_t num, size_t width, int(*compar)(const void* p1, const void* p2))
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < num - 1; i++)
- {
- for (j = 0; j < num - i - 1; j++)
- {
- //arr[j] > arr[j+1]
- if (compar((char*)base + j * width,(char*)base + (j + 1) * width) > 0)
- {
- swap((char*)base + j * width,(char*)base + (j + 1 )* width,width);
- }
- }
- }
- }
因为我们不知道即将传来的数据是哪种类型的,所以我们将数据先转化成最小的char类型,因为传来的参数包括每个元素所占空间的大小,也就是几个字节,所以我们可以每个字节每个字节的对比和交换。
需要用到的compar函数和上面qsort所用到的各个cmp函数是相同的。
- void swap(char* p1,char* p2,size_t width)
- {
- int i = 0;
- for (i = 0; i < width; i++ )
- {
- char tmp = *p1;
- *p1 = *p2;
- *p2 = tmp;
- p1++;
- p2++;
- }
- }
这就是今天的使用qsort函数和模拟实现qsort函数啦!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。