一、普通的冒泡函数(整数排序)
#include<stdio.h>
void bubble_sort(int* arr,int sz)
{
int i=0;
for(i=0;i<sz-1;i++)
{
int j=0;
for(j=0;j<sz-i-1;j++)
{
if(arr[j]<arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
int main()
{
int arr[10]={2,1,5,4,8,6,5,4,10};
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
这个普通的冒泡函数的局限性是:只能对整数进行排序,而当我们想对一些浮点型数据或者结构体进行一系列排序时,这串代码是不能执行出我们所想要的东西
所以就有了高级的冒泡排序,其实它已经不叫冒泡排序了,但是接下来的这种排序方式适用于各种类型的数据。
首先:先让我们了解一个函数:qsort函数
再了解一下qsort函数里面的四个参数
翻译成中文就是:
base:目标数组的起始位置,也就是数组首元素地址
num:数组的元素个数sz
size:数组中每个元素的字节大小--sizeof(arr[0])
compar:实质上是一个函数指针,而这个指针所指的函数的参数是void*类型(无类型)
介绍一下void*类型的指针
//void*
int main()
{
int i=10;
//int* pi=&i;
//char* pa=&i;
void* pi=&i;//void*类型的指针可以接收任意类型的地址
//pi=30;
//pi++; void*类型的指针不可以加减数
//*pi=11;void*类型的指针不可以解引用操作
//因为不知道要访问几个字节
}
正是因为void*类型的指针可以接收任意类型的地址,所以不仅可以对整形数据进行排序,也可以对浮点型或者结构体型的数据进行排序。
#include<stdio.h>
#include<stdlib.h>
int com_float(const void*p1,const void* p2)
{
//由于指针p1和p2是void类型的,所以强制类型转换成要排的类型
return *(float*)p1-*(float*)p2;//这是qsort函数的规则
}
int main()
{
float arr[4]={3.4,4.1,2.4};
int sz=sizeof(arr)/sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),com_float);
int i=0;
for(i=0;i<sz;i++)
{
printf("%f ",arr[i]);
}
}
同理:可以自己尝试用qsort函数排序结构体类型的数据
你们的评论与点赞就是对我最大的支持。