首先,要理解什么是冒泡排序,冒泡排序首先就是把无序的一组数,转化成为有序的,像冒泡一样,把排序好的数,一点点的冒出来,比如如下代码
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;
}
这是代码的实现,看到这别忘了点个赞哦;