国内旅行做行程网站,南充房管局官网,网站链接只显示到文件夹怎么做的,ui设计说明万能模板一#xff0c;本文目标
qsort函数可以对任意类型数据甚至是结构体内部的数据按照你想要的规则排序#xff0c;它的功能很强大#xff0c;可是为什么呢#xff1f;
我将通过模拟实现qsort函数来让你对这整个过程有一个清晰的深刻的理解。 二#xff0c;qsort函数原型
v…一本文目标
qsort函数可以对任意类型数据甚至是结构体内部的数据按照你想要的规则排序它的功能很强大可是为什么呢
我将通过模拟实现qsort函数来让你对这整个过程有一个清晰的深刻的理解。 二qsort函数原型
void qsort (void* base,//要排序的对象的第一个元素的首地址size_t num, //对象的个数size_t size,//每一个对象的大小 Size in bytesint (*compar)(const void*,const void*));//Pointer to a function that compares two elements.并且这个函数要自己写 qsort函数底层通过快速排序进行但是这并不是我们感兴趣的点我想要知道qsort为什么可以对任意类型数据进行排序与它用什么排序算法排序没有关系所以我们用相对简单的冒泡排序来代替快速排序的算法把冒泡排序赋予可以对任意类型数据进行排序的强大功能。 三冒泡排序——大数沉底小数上浮 对于冒泡排序其基本思想是大数沉底小数上浮
这里直接给出源码
void Bubble_sort(int arr[], int size)
{int j,i;for (i 0; i size-1;i)//排序趟数等于元素个数-1{int f 0;for (j 0; j size - 1 - i; j)//每一趟都有一个元素复位需要排序的次数每次-1{if ( arr[j] arr[j1] ){int tem arr[j];arr[j] arr[j1];arr[j1] tem;f 1;}}if (f 0) {break;}}
3.1相对于qsort冒泡排序的局限性 只能排序整形数据
四两个问题
4.1不定类型比较问题 1.对于if内部的判断虽然字符型可以用 ,, 比较但是对于字符串类型无法通过常规方法比较
4.2不定类型交换问题 2.对于交换部分由于不同元素的类型不同占用的内存空间也不同如何判断传入数据的类型并实现两个数据的交换呢 五改造冒泡排序
我们将自己模拟实现的qsort函数称my_qsort实现如下 void my_qsort(void* base,size_t sz,size_t width,int (*cmp)(const void* p1,const void* p2))//cmp 是函数指针在my_sort中被多次调用
{//它指向的函数是int_cmpint_cmp就是回调函数int i 0;for(i 0;i sz - 1;i)//趟数不变{int j 0;for(j 0;j sz - i - 1;j)//每一趟进行的比较数不变{if(cmp((char*)base j * width,(char*)base (j 1) * width) 0 )//判断要改变{Swap((char*)base j * width,(char*)base (j 1) * width,width);}}}
}5.1不同类型比较
我们定义一个cmp函数来实现比较
5.1.1cmp实参
我们传入排序的数组的首元素地址base将base强制类型转化为 char* 类型这样base与整数的运算就只会跨过这个整数个字节
如果再知道每个元素的大小长度那么我们就可以精确的访问到每个元素了 怎么理解呢 e.g.1:对于int 图中的base指针的位置是 j 1的位置 e.g.2:对于char 图中的base指针的位置是 j 5 的位置 5.1.2cmp形参
int int_cmp(const void* p1,const void* p2)
{return *(int*)p1 - *(int*)p2;
}
由于比较的对象是整型所以定义一个比较整形的函数void* 类型不能直接解引用所以将p1p2强制类型转化将两数相减返回。
5.2不定类型交换问题
定义交换函数Swap
void Swap(char* buf1,char* buf2,int width)//按字节逐个交换
{for(int i 0;i width;i){char tem *buf1;*buf1 *buf2;*buf2 tem;buf1;//如果是整型则要遍历四个字节buf2;}
}这时候我们就知道定义width的意义了对于一个数据类型我们虽然不知道它的类型但是我们可以根据它的长度一个一个字节地交换数据。 整体代码运行
对于所有类型我们的冒泡排序都可以排序了它的作用与库函数qsort一致仍然需要我们自己写cmp函数
对int型数据的排序
#includestdio.h
#includestring.h
int int_cmp(const void* p1,const void* p2)
{return *(int*)p1 - *(int*)p2;
}
void Swap(char* buf1,char* buf2,int width)//按字节逐个交换
{for(int i 0;i width;i){char tem *buf1;*buf1 *buf2;*buf2 tem;buf1;//如果是整型则要遍历四个字节buf2;}
}void my_qsort(void* base,size_t sz,size_t width,int (*cmp)(const void* p1,const void* p2))//cmp 是函数指针在my_sort中被多次调用
{//它指向的函数是int_cmpint_cmp就是回调函数int i 0;for(i 0;i sz - 1;i)//趟数不变{int j 0;for(j 0;j sz - i - 1;j)//每一趟进行的比较数不变{if(cmp((char*)base j * width,(char*)base (j 1) * width) 0 )//判断要改变{Swap((char*)base j * width,(char*)base (j 1) * width,width);}}}
}void test1(void)
{int arr[] {2,5,8,9,6,3,1,4,7,0};int sz sizeof(arr)/sizeof(arr[0]);my_qsort(arr,sz,sizeof(arr[0]),int_cmp);for(int i 0;i sz;i){printf(%d ,arr[i]);}
}int main()
{test1();return 0;
}对于结构体类型也可根据结构体内部某一元素的特征排序
结构体类型
对结构体内的int型数据排序 struct stu
{char name[20];int age;
};int struct_cmp_by_age(const void* p1,const void* p2)
{return ((struct stu*)p1)-age - ((struct stu*)p2)-age;
}void test2(void)
{struct stu arr[] {{zhangsan,18},{lisi,25},{wangwu,30},{xiaoming,40}};int sz sizeof(arr)/sizeof(arr[0]);my_qsort(arr,sz,sizeof(arr[0]),struct_cmp_by_age);for(int i 0;i sz;i){printf(%s %d\n,arr[i].name,arr[i].age);}
}int main()
{test2();return 0;
}
对结构体内的char型数据排序 struct stu
{char name[20];int age;
};int struct_cmp_by_name(const void* p1,const void* p2)
{return strcmp(((struct stu*)p1)-name,((struct stu*)p2)-name);
}void test3(void)
{struct stu arr[] {{zhangsan,18},{lisi,25},{wangwu,30},{xiaoming,40}};int sz sizeof(arr)/sizeof(arr[0]);my_qsort(arr,sz,sizeof(arr[0]),struct_cmp_by_name);for(int i 0;i sz;i){printf(%s %d\n,arr[i].name,arr[i].age);}
}int main()
{//test1();//test2();test3();return 0;
} 1.对字符串的比较用到string.h中的strcmp函数而它的返回值正好符合qsort函数第四个参数函数的要求 第一个字符串大于第二个strcmp返回大于0的数对应qsort函数要求第四个函数的返回值大于0表示第一个参数大一第二个。 本文回顾
目录
一本文目标
二qsort函数原型
三冒泡排序——大数沉底小数上浮
3.1相对于qsort冒泡排序的局限性
四两个问题
4.1不定类型比较问题
4.2不定类型交换问题
五改造冒泡排序
5.1不同类型比较
5.1.1cmp实参
5.1.2cmp形参
5.2不定类型交换问题
整体代码运行
对int型数据的排序
结构体类型
对结构体内的int型数据排序
对结构体内的char型数据排序 完~
未经作者同意禁止转载