模拟qsort库函数的实现—任何类型的数据都可以排序


前言

实现—任何类型的数据都可以排序(整数,小数,结构体等等);

一.void* 的使用说明

void* 是指针类型,可以存放任何类型的地址!!!

但是第一:不能进行解引用操作,得强制转换类型才可以解引用操作;

第二:不能进行加减整数操作!!!也得强制类型才行!!!

二、qsort的使用原理

aef708c4ba6948c2b73c76e8441279a1.png

 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);
        }
    }
}

03dd96c81ff14c35a5268a7b5056552b.png

 这个玩意就是用于交换的函数了,因为要交换数据的大小是不知道的,所以把数据所占字节个数大小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;
}

总结

希望对大家有用!!!

猜你喜欢

转载自blog.csdn.net/qq_68844357/article/details/124533498