冒泡排序和qsort函数排序

本文介绍冒泡排序算法及qsort函数的应用,包括基本原理、实现代码及如何对整型、浮点数和结构体进行排序。还展示了如何用冒泡排序实现qsort函数的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序和qsort函数排序

冒泡排序

//冒泡排序 只能排序整型数据
void Bobble_sort(int arr[], int len) {
	//遍历n-1趟
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - i - 1; j++) {
		//两两比较,交换
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
void print(int arr[], int len) {
	int i = 0;
	for (i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
}
int main() {
	int arr[] = { 3,8,6,4,9,5,2,1,0,7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Bobble_sort(arr, len);
	print(arr, len);
	return 0;
}

qsort函数排序

在这里插入图片描述
base:待排序数组第一个对象的指针。
num:待排序数组元素的个数。
size:每个元素的大小。
int(*comper)(const void *,const void *):比较两个元素大小的函数指针。
通过comper函数指针调用相关的函数。

qsort函数排序整型数据

//qsort函数排序整型数据
int cmp_int(const void* e1, const void* e2) {
	return *((int*)e1) - *((int*)e2);
	       //void不能直接解引用,必须强制类型转换
}
int main() {
	int arr[] = { 3,8,6,4,9,5,2,1,0,7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

qsort函数排序浮点数数据

//qsort函数排序浮点类型数据
int cmp_float(const void* e1, const void* e2) {
	return ((int)(*(float*)e1 - *(float*)e2));
}
int main() {
	float arr[] = { 3.4,1.2,5.6,2.0,6.6,4.5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, len, sizeof(arr[0]), cmp_float);
	for (int i = 0; i < len; i++) {
		printf("%.2f ", arr[i]);
	}
	return 0;
}

qsort函数排序结构体类型

//qsort函数排序结构体类型
//定义结构体
struct stu
{
	char name[10];
	int age;
};
int cmp_by_name(const void* e1, const void* e2) {
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
    //字符串比较使用strcmp
}
//int cmp_by_age(const void* e1, const void* e2) {
//	return (((struct stu*)e1)->age - ((struct stu*)e2)->age);
//}
int main() {
	struct stu s[] = { {"wang xi",25},{"zhao min",18},{"chaoli",36} };
	int len = sizeof(s) / sizeof(s[0]);
	qsort(s, len, sizeof(s[0]), cmp_by_name);
	//qsort(s, len, sizeof(s[0]), cmp_by_age);
	for (int i = 0; i < len; i++) {
		printf("%s ", s[i].name);
	}
	/*for (int i = 0; i < len; i++) {
		printf("%d ", s[i].age);
	}*/
	return 0;
}

利用冒泡排序实现qsort函数排序

//利用冒泡排序实现qsort函数排序
int cmp_int(const void* e1, const void* e2) {
	return *((int*)e1) - *((int*)e2);
}
void Swap(char* buf1, char* buf2, int width) {
	for (int i = 0; i < width; i++) {
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void Bubble_sort(void* base, int len, int width, int(*cmp)(const void* e1, const void* e2)) {
	for (int i = 0; i < len-1; i++) {
		for (int j = 0; j < len - 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);
			}
		}
	}
}
int main() {
	int arr[] = { 3,8,6,4,9,5,2,1,0,7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Bubble_sort(arr, len, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < len; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)中cmp是回调函数,通过函数指针调用相应的函数,cmp指向cmp_int,cmp_float,cmp_by_name等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值