qsort函数的使用和模拟实现

简介: qsort函数的使用和模拟实现

1.qsort使用

qsort是C语言提供的一个库函数,他可以对任何类型的排序进行比较,很通用。

第一个参数为待排元素首地址,第二个参数为元素个数,第三个参数为元素宽度,第四个参数为比较函数。

下图为比较整型的代码示例:

而应对不同的数据类型,我们只需修改相应的cmp即可

1.1 浮点型(double)

int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针
{
  double* p1 = (double*)e1;
  double* p2 = (double*)e2;
  if ((*p1 - *p2) < 0)
  {
    return -1;
  }
  else if ((*p1 - *p2) > 0)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

因为*p1和*p2,都是double型数,如果两个数相差不大时,由于返回类型为int,数据不等但是会导致返回类型为0的问题。因此用if语句较合适。

1.2字符串类型

int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针
{
  char* p1 = (char*)e1;
  char* p2 = (char*)e2;
  return strcmp(p1, p2);
}

字符串何以借助strcmp函数来比较,而strcmp的逻辑正好与cmp的逻辑相同,因此可以直接使用。

1.3结构体类型

struct Peo
{
  char name[20];
  int score;
};
int cmp(const void* e1, const void* e2)//void *可以用来接收任何类型的指针
{
  struct Peo * p1 = (struct Peo*)e1;
  struct Peo* p2 = (struct Peo*)e2;
  return p1->score - p2->score;
}

2.qsort模拟实现

由于博主能力有限,现使用bubble_sort的逻辑来实现qsort。

void Swap(char* p1, char* p2,int width)
{
  int i = 0;
  //一个字节一个字节的交换
  for (i = 0; i < width; i++)
  {
  //tem不要用cahr *tem;
    char tem = *(p1+i);
    *(p1+i) = *(p2+i);
    *(p2 + i) = tem;
  }
}
//base 元素首地址 ,num 元素个数,width元素宽度, cmp辅助比较函数
void bubble_sort(void* base, int num, int width, int (*cmp)(const void* e1, const void* e2))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < num - 1; i++)
  {
    for (j = 0; j < num - 1 - i; j++)
    {
      //传进去第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);
      }
    }
  }
}

以上是qsort的简单模拟,如有问题,恳请大佬指点💖

目录
相关文章
|
21天前
|
搜索推荐 C语言
模拟实现qsort函数:冒泡排序详解
模拟实现qsort函数:冒泡排序详解
|
1月前
|
搜索推荐 C语言
冒泡排序模拟实现qsort()函数
冒泡排序模拟实现qsort()函数
23 0
|
10月前
qsort函数和模拟实现qsort函数
qsort函数和模拟实现qsort函数
|
10月前
|
C语言
c语言用冒泡排序模拟实现qsort排序
c语言用冒泡排序模拟实现qsort排序
58 0
|
6月前
|
程序员
qsort函数的模拟实现
qsort函数的模拟实现
32 1
|
8月前
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
44 0
|
8月前
|
存储 算法 测试技术
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
24 0
|
11月前
|
算法
C进阶:指针(2),qsort函数,模拟实现冒泡算法(上)
C进阶:指针(2),qsort函数,模拟实现冒泡算法
49 0
|
11月前
|
算法 搜索推荐
C进阶:指针(2),qsort函数,模拟实现冒泡算法(下)
C进阶:指针(2),qsort函数,模拟实现冒泡算法(下)
56 0
|
搜索推荐 C语言
【C语言】“qsort函数详解”与“使用冒泡思想模拟使用qsort”
qsort的介绍: qsort ()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中 此函数需要四个参数void qsort(void* *base, size_t nitems, size_t size, int (compar)(const void * , const void)) char* base —— 指向要排序的数组首元素地址的指针 size_t nitems —— 要排序数组的元素个数 size_t size —— 数组每个元素大的小 (有非常重要的作用) int compar(const void *,const void *) —— 由使用者提供的一