之前的指针详解中,提到过qsort函数,这个函数是用来排序的,然后我后来也自己敲了一次qsort函数,就当做笔记分享一下:
#include<stdio.h> #include<string.h> //实现bubble_sort函数的程序员,他是否知道未来排序的数据类型:不知道。
//那程序员也不知道:待比较的两个元素类型。 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 bubble_sort(void* base, int sz, int width, int (*cmp)(void*
e1, void* e2)) { int i = 0; //趟数。 for (i = 0; i < sz - 1; i++) { //每一趟比较的对数。
int j = 0; for (j = 0; j < sz - 1 - i; j++) { //两个元素的比较。 if (cmp((char*)base + j
* width, (char*)base + (j + 1) * width) > 0) { //交换 Swap((char*)base + j * width
, (char*)base + (j + 1) * width, width); } } } } int cmp_int(void* e1, void* e2)
{ //比较两个整形值的 return *(int*)e1 - *(int*)e2; } void test1() { int arr[10] = { 9,8,
7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]);
//使用bubble_sort的程序员一定知道自己排序的是什么数据。 //就应该知道如何比较待排序数组中的元素。 bubble_sort(arr, sz,
sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ",
arr[i]); } printf("\n"); } struct Stu { char name[20]; int age; }; //int
cmp_stu_by_age(void* e1, void* e2) //{ // return ((struct Stu*)e1)->age -
((struct Stu*)e2)->age; //} int cmp_stu_by_name(void* e1, void* e2) {
//比较名字就是比较字符串。 //字符串比较不能直接用><=来比较,应该用strcmp函数。
//strcmp函数对应的头文件为#include<string.h>。 return strcmp(((struct Stu*)e1)->name, ((
struct Stu*)e2)->name); } void test2() { struct Stu s[3] = { {"zhangsan",20},{
"lisi",30},{"wangwu",10} }; int sz = sizeof(s) / sizeof(s[0]); //bubble_sort(s,
sz, sizeof(s[0]), cmp_stu_by_age); bubble_sort(s, sz, sizeof(s[0]),
cmp_stu_by_name); int i = 0; for (i = 0; i < sz; i++) { printf("%8s-%2d\n", s[i]
.name, s[i].age); } printf("\n"); } int main() { test1(); test2(); return 0; }

技术
©2019-2020 Toolsou All rights reserved,
Python学习笔记(一)Linux【shell】 shell编程创建一个线程——— Javaweb (3)evo工具使用问题——Degenerate covariance rank, Umeyama alignment is not possibleVMware 16安装centos 7详细教程C语言做一个简易的登陆验证(功能)界面C语言——qsort函数Spring Boot面试必问:自动配置原理Android EditText密码显示隐藏Qt入门教程【基础控件篇】QCalendarWidget日历控件