前言
实现—任何类型的数据都可以排序(整数,小数,结构体等等);
一.void* 的使用说明
void* 是指针类型,可以存放任何类型的地址!!!
但是第一:不能进行解引用操作,得强制转换类型才可以解引用操作;
第二:不能进行加减整数操作!!!也得强制类型才行!!!
二、qsort的使用原理
qsort需要4个参数,第一个是要排序的数组名字,第二是要排序的元素个数,第三是要排序元素的大小,单位是字节,最后一个是函数指针,返回值是int类型,参数是两个const void* 类型的参数;
三,模拟实现qsort函数---(bubble_sort函数)
bubble_sort函数的参数和qsort的参数是相似的,可以理解为更好实现排序的功能;最重要的点是再两重for循环里面中if的cmp函数的调用,两重for循环是用来交换每个要交换的数的,便于将要排的数据都能够进行排序,知道冒泡排序法的老铁应该一眼就懂;第一个for循环是控制排序的个数,第二个是控制一个数据排好的次数;
void*是不能解引用的,使用用强制类型,又不知道用户要排的是啥类型的数据,所以数据大小不知道,所以强制类型后加上width控制指针指向下一个数据的地址,j*width不就是控制指向每一个数据的地址吗?再用Swap函数进行交换;
void bubble_sort(void* base, int sz, int width, int cmp( const void* e1, const void* e2))
{
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++) {
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);
}
}
}
这个玩意就是用于交换的函数了,因为要交换数据的大小是不知道的,所以把数据所占字节个数大小width传过来了,再一个字节这样交换嘛;
四,总代码
#include <stdio.h>
#include <string.h>
typedef struct stu {
int age;
char name[20];
}stu;
void Swap(char* e1, char* e2, int width) {
int i = 0;
for (i = 0; i < width; i++) {
int tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
void bubble_sort(void* base, int sz, int width, int cmp( const void* e1, const void* e2))
{
int i = 0, j = 0;
for (i = 0; i < sz - 1; i++) {
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( const void* e1, const void* e2) {
// return (int*)e1 - (int*)e2;
//}
//int cmp( const void* e1, const void* e2) {
// return (float*)e1 - (float*)e2;
//}
int cmp( const void* e1, const void* e2) {
return strcmp(((stu*)e1)->name,((stu*)e2)->name);
}
//int cmp( const void* e1, const void* e2) {
// return ((stu*)e1)->age - ((stu*)e2)->age;
//}
void test3() {
stu arr3[] = { {13,"zhang san"},{22,"li si"},{31,"wang wu"}};
int sz = sizeof(arr3) / sizeof(arr3[0]);
bubble_sort(arr3, sz, sizeof(arr3[0]), cmp);
int i = 0;
for (i = 0; i < 3; i++) {
printf("%s\n", arr3[i].name);
}
}
//void test2() {
// float arr2[] = { 2.0,5.0,1.0,10.0,6.0,9.0,4.0,8.0,7.0,3.0 };
// int sz = sizeof(arr2) / sizeof(arr2[0]);
// bubble_sort(arr2, sz, sizeof(arr2[0]), cmp);
//}
//void test1() {
// int arr1[] = { 2,3,5,1,7,4,0,9,8,6 };
// int sz = sizeof(arr1) / sizeof(arr1[0]);
// buddle_sort( arr1, sz, sizeof(arr1[0]), cmp);
//}
int main()
{
/*test1();
test2();*/
test3();
return 0;
}
总结
希望对大家有用!!!