用冒泡排序的思想,模拟实现qsort函数

首先,要理解什么是冒泡排序,冒泡排序首先就是把无序的一组数,转化成为有序的,像冒泡一样,把排序好的数,一点点的冒出来,比如如下代码

void buffle_sort(int* arr,int sz){
	//i代表了需要冒泡排序的趟数
	for(int i=0;i<sz-1;i++){
		//j代表了需要比较的两两元素
		//从小到大的顺序
		for(int j=0;j<sz-1-i;j++){
			if(arr[j]>arr[j+1]){
				int temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
}
int main(){
	int arr[]={2,3,5,6,8,9,0,4,1,7};
	int sz=sizeof(arr)/sizeof(arr[0]);
	bubble_sort(arr,sz);
}

冒泡排序有点局限性,在这里只能排序整形的数组,那如果我想使用结构体排序呢,或者我使用float类型进行排序呢,这里的冒泡排序就要重写。
为了更加的方便,使用库函数qsort进行排序

//void qsort (void* base, 这里是函数的首地址
//			   size_t num, 表示的是需要排序的个数
//			   size_t size,表示的需要排序的元素的字节数
//            int (*compar)(const void*,const void*));
//                      表示两个元素需要怎么去比较

下面对qsort进行使用

#include<stdlib.h>
struct stu{
	char name[20],
	int age;
}
int cmp_int(const void* e1,const void* e2){
		//从小到大的顺序排序
		//此时如果需要从大到小,把e1和e2的变换一下就行
		return *(int*)e1-*(int*)e2;
}
int cmp_by_name(const void* e1,const void* e2){
	return strcmp(((struct stu*)e1)->name,
	((struct stu*)e2)->name);
}
int cmp_by_age(const void* e1,const void* e2){
	return ((struct stu*)e1)->age-((struct stu*)->age);
}
void test1(){
	int arr[]={2,3,5,6,8,9,0,4,1,7};
	int sz=sizeof(arr)/sizeof(arr[0]);
	qsort(arr,sz,sizeof(arr),cmp_int)
}
void test2(){
	struct stu s[3]={{"zhangsan",30},{"lisi",15},{"wangwu",50}};
	int sz=sizeof(s)/sizeof(s[0]);
	//qsort(s,sz,sizeof(s[0]),cmp_by_name);
	qsort(s,sz,sizeof(s[0],cmp_by_age);
}
int main(){
	test1();
	test2();
}

由于冒泡排序使用的话要规定类型,所以使用冒泡排序的思想,模拟实现qsort函数,但是我们要知道,qsort的底层逻辑是用快速排序实现的。
下面看这一段代码

struct stu{
	char name[20];
	int age;
};
int cmp_by_name(const void* e1,const void* e2){
	return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
}
void swap(char* buf1,char* buf2,int width){
	for(int i=0;i<width;i++){
		char temp=*buf1;
		*buf1=*buf2;
		*buf2=temp;
		buf1++;
		buf2++;
	}
}
void bubble_sort2(void* base,int sz,int width
						,int(*cmp)(const void* e1,const void*e2)){
	for(int i=0;i<sz-1;i++){
		for(int 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);
			}
		}
	}
}
void test(){
	struct stu s[3]={{"zhangsan",50},{"wangwu",20},{"lisi",30}};
	int sz=sizeof(s)/sizeof(s[0]);
	bubble_sort2(s,sz,sizeof(s[0]),cmp_by_name);
	
}
int main(){
	test();
	return 0;
}

这是代码的实现,看到这别忘了点个赞哦;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值