qsort函数详解

简介: qsort函数详解

最近笔者又浅学关于qsort函数的排序方法!下面且听笔者一一道来!


不知道大家对于qsort函数了解多少!可能仅仅限制在qsort函数是快速排序的函数,至于其他的就……额,不知道了!下面请看笔者对于qsort函数的讲解!但也不敢保懂!!


下面笔者是参考部分文献得来的内容!敬请欣赏:


qsort
void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

对数组的元素进行排序

对 所指向的数组元素进行排序,每个元素的长度为长,使用函数确定顺序。


此函数使用的排序算法通过调用指定函数并指向元素的指针作为参数来比较元素对。


该函数不返回任何值,但通过对所定义的数组元素进行重新排序来修改所指向的数组的内容。


原文内容为:


0a2653c851af460fa595bd959398a8f1.png


对于qsort我们在上面考研看出来,返回值为void 类型,即:可以排序(大小排序)任意类型的数据!


下面笔者就定义:进行简单的讲解!!


void qsort (void* base,
           size_t num,  
           size_t size,
           int (*compar)(const void*,const void*));

1.void* base :指向待排序数组的起始位置!


2.size_t num :待排序数组的元素个数!


3.size_t size :(所占字节)待排序数组的元素大小!


4.int (*compar)(const void*,const void*)) 这个就需要我们好好进行分析一下!


我们可以将int (*compar)(const void*,const void*))  进行分开处理!


int (*compar)(const void*,const void*))

 

        函数:    (const void*,const void*)

        指针:    *compar

        返回类型: int

因此,对于int (*compar)(const void*,const void*)) ,我们可以概述为:比较两个元素大小的函数指针!


回想一下:对于不同的数据类型,有着不同的比较方式!所以……qsort显现出来独一无二的作用!


对于两个整型,运用关系运算符进行比较大小(>,<);


对于两个字符串,使用库函数strcmp进行比较大小;


对于两个结构体,也得制定比较方式!


因此我们可以用qsort函数来进行……比较 !


下面请看笔者用qsort函数测试排序整型数组!请看代码!


#include <stdlib.h>
#include <stdio.h>
void print(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  printf("\n");
}
int cmp_int(const void* e1, const void* e2)
{
  if (*(int*)e1 > *(int*)e2)
  return 1;
  else if (*(int*)e1 < *(int*)e2)
  return -1;
  else
  return 0;
}
void test2()
{
  int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  qsort(arr, sz, sizeof(arr[0]), cmp_int);
  print(arr, sz); //打印
}
int main()
{
  test2();
  return 0;
}

对于上述代码,笔者只对最重要的那一部分进行简单讲解!请读者注意一下!!显而易见的就是该段代码:


int cmp_int(const void* e1, const void* e2)
{
  if (*(int*)e1 > *(int*)e2)
  return 1;
  else if (*(int*)e1 < *(int*)e2)
  return -1;
  else
  return 0;
}

对于: *(int*)e1 与  *(int*)e2; 我们再定义e1与 e2的时候,是定义的void(空类型),所以在使用之前,先将e1与 e2通过  (int*)e1 与  (int*)e2 强制类型转换为: int* 类型!然后在进行解引用操作!


对于在该段代码里面的  if 语句的内容,可以更改为:retrun  (*(int*)e1  -  *(int*)e2);  (升序)(要是想要降序,则可以对调一下)


原因在于:


6de278e6d6694ce5bb08e7e842b7e74b.png


qsort函数的返回值为int整型!!


对于上述代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


对于这篇文章,笔者所写内容大致到此结束!!有不同想法的读者请与笔者进行私聊!!


感激!!


相关文章
|
6月前
qsort函数专题
qsort函数专题
37 2
|
5月前
|
C语言
qsort函数的应用
qsort函数的应用
31 0
qsort函数和模拟实现qsort函数
qsort函数和模拟实现qsort函数
|
6月前
|
搜索推荐
【qsort函数实现】
【qsort函数实现】
|
6月前
|
JavaScript 前端开发
sort函数排序
sort函数排序
55 0
sort函数排序
|
6月前
|
算法 搜索推荐 C语言
快速排序和qsort函数详解详解qsort函数
快速排序和qsort函数详解详解qsort函数
85 0
|
11月前
|
容器
sort函数
sort函数
|
搜索推荐 C语言
qsort函数的讲解
qsort函数的讲解
56 0
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
69 0
|
搜索推荐 C语言
冒泡排序与qsort函数详解
提及到排序,冒泡排序算是一个很基础的排序了。那么冒泡排序到底是什么呢?冒泡排序在什么情况下使用呢?qsort函数又是什么呢?接下来我给大家通过举例来详细解释一下。
57 0