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