一、普通的冒泡函数(整数排序)

#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函数)_数组


再了解一下qsort函数里面的四个参数

冒泡函数与高级冒泡函数(qsort函数)_i++_02

翻译成中文就是:

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函数排序结构体类型的数据

你们的评论与点赞就是对我最大的支持。