对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序:

c 复制代码
int main()
{
	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
	int sz = sizeof(arr)/sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz-1; i++) {

		int j = 0;
		for (j = 0; j < sz-1-i; j++) {
			if (arr[j] > arr[j + 1])
			{
				int temp = 0;
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

可以看出这样的排序方法只适用于整形类型的数

那么是否有一种排序可以满足所有类型都适用的排序呢?

qsort函数排序

应用:

在这里需要补充一下void* 类型的指针

c 复制代码
void in_mp(const void* p1, const void* p2)
{
    return(*(int*) p1 - *(int*)p2);
}
void print(int arr[], int sz)
{
    int i = 0; 
    for (i = 0; i < sz; i++)
    {
        printf("%d", arr[i]);
    }
}
void test1()
{
    int arr[] = { 9,6,7,8,5,3,4,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), in_mp);
    print(arr ,sz);
}
int main()
{
    test1();
    return 0;
   
}

当然qsort函数排序既然可以实现任意类型,那么我们换几个类型试一下;
结构体类型

c 复制代码
struct stu
{
	char name[20];
	int age;
};
void com_in(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d ",arr[i].name, arr[i].age);
	}
}
void test2()
{
	
	struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), com_in);
	print(arr, sz);
}
int main()
{
	test2();
	return 0;
}


用冒泡排序的思想实现一个功能类似于qsort函数的排序

首先我们先讲一下qsort函数的原理

然后我们用冒泡排序的思想来改造

所以我们要自己创造一个qsort排序函数就要自己写一个可以排序任意类型数据的函数

我们用冒泡排序的思想来改造,就要解决一下问题

问题一

解决后:

问题2

解决:

代码:

c 复制代码
//测试整形类型的的排序
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
}
int in_mp(const void* p1, const void* p2)
{
	return(*(int*)p1 - *(int*)p2);

}
tmp(char* put1, char* put2, int size)
{
	int i = 0;
	int temp = 0;
	for (i = 0; i < size; i++)
	{
		 temp = *put1;
		*put1 = *put2;
		*put2 = temp;
		put1++;
		put2++;
		
	}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++) {

		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
           //把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换
			if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) 
			{
           //交换
				tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);
				
			}
		}
	}
}
void test1()
{
	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
	print(arr, sz);
}
int main()
{
	test1();
	return 0;
}

也可以测试结构体类型

c 复制代码
tmp(char* put1, char* put2, int size)
{
	int i = 0;
	int temp = 0;
	for (i = 0; i < size; i++)
	{
		 temp = *put1;
		*put1 = *put2;
		*put2 = temp;
		put1++;
		put2++;
		
	}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++) {

		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
           //把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换
			if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) 
			{
           //交换
				tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);
				
			}
		}
	}
}



//void test1()
//{
//	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
//	print(arr, sz);
//}
struct stu
{
	char name[20];
	int age;
};

int com_in(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d ", arr[i].name, arr[i].age);
	}
}
void test2()
{

	struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bobble_sort(arr, sz, sizeof(arr[0]), com_in);
	print(arr, sz);
}
int main()
{
	test2();
	return 0;
}
相关推荐
类球状25 分钟前
顺序表 —— OJ题
算法
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
小王在进步1 小时前
快速排序算法_图文详解_这一篇就够了!
排序算法
指针满天飞1 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
CoovallyAIHub1 小时前
方案 | 动车底部零部件检测实时流水线检测算法改进
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
方案 | 光伏清洁机器人系统详细技术实施方案
深度学习·算法·计算机视觉
lxmyzzs1 小时前
【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
人工智能·opencv·算法·计算机视觉·裂缝检测·yolo12
洋曼巴-young1 小时前
240. 搜索二维矩阵 II
数据结构·算法·矩阵
丑小鸭是白天鹅2 小时前
嵌入式C语言学习笔记之枚举、联合体
c语言·笔记·学习
GUET_一路向前2 小时前
【C语言防御性编程】if条件常量在前,变量在后
c语言·开发语言·if-else·防御性编程