C语言-qsort函数基本使用

简介: C语言-qsort函数基本使用

先来看一下qsort函数的介绍:


1.png

2.png

Compare 函数的返回值 描述
>0 elem1将被排在elem2前面
0 elem1等于elem2
<0 elem1 将被排在elem2后面


参数

  • base-- 指向要排序的数组的第一个元素的指针。
  • nitems-- 由 base 指向的数组中元素的个数。
  • size-- 数组中每个元素的大小,以字节为单位。
  • compar-- 用来比较两个元素的函数,即函数指针(回调函数)


compar参数


compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void

*型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。


排序整型数组

```c
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* num1,const void* num2)
{
  int* pa = (int*)num1;
  int* pb = (int*)num2;
  return *pa - *pb;
}
int main()
{
  int arr[5] = { 2,3,1,6,5 };
  qsort(arr, 5, sizeof(arr[0]), cmp_int);
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

3.png

想要从大到小的话,把return *pa - *pb;倒过来即可,即return *pb - *pa;。


排序浮点型数组

int cmp_int(const void* num1, const void* num2)
{
  float* pa = (float*)num1;
  float* pb = (float*)num2;
  return *pa > *pb ? 1 : -1;
}
int main()
{
  float arr[6] = { 2,3,1,6,5,5 };
  qsort(arr, 6, sizeof(float), cmp_int);
  int i = 0;
  for (i = 0; i < 6; i++)
  {
    printf("%f ", arr[i]);
  }
  return 0;
}

4.png


排序结构体

//按语文成绩排序
typedef struct
{
  char name[10];
  int Chinese;
  int Math;
  int English;
}Student;
Student students[7];
void readData()//读入学生数据
{
  FILE* file = fopen("mark.txt", "r");
  int i = 0;
  for (i = 0; i < 7; i++)
  {
    fscanf(file, "%s", students[i].name);
    fscanf(file, "%d", &students[i].Chinese);
    fscanf(file, "%d", &students[i].Math);
    fscanf(file, "%d", &students[i].English);
  }
  fclose(file);
  file = NULL;
}
void DisPlayData()
{
  int i = 0;
  for (i = 0; i < 7; i++)
  {
    printf("%s\t", students[i].name);
    printf("%d\t", students[i].Chinese);
    printf("%d\t", students[i].Math);
    printf("%d\n", students[i].English);
  }
}
int cmp(const void* num1, const void* num2)
{
  Student* pa = (Student*)num1;
  Student* pb = (Student*)num2;
  int num3 = pa->Chinese;
  int num4 = pb->Chinese;
  return num3 - num4;
}
int main()
{
  readData();
  qsort(students, 7, sizeof(Student), cmp);
  DisPlayData();
  return 0;
}

按总分数排序

typedef struct
{
  char name[10];
  int Chinese;
  int Math;
  int English;
}Student;
Student students[7];
void readData()//读入学生数据
{
  FILE* file = fopen("mark.txt", "r");
  int i = 0;
  for (i = 0; i < 7; i++)
  {
    fscanf(file, "%s", students[i].name);
    fscanf(file, "%d", &students[i].Chinese);
    fscanf(file, "%d", &students[i].Math);
    fscanf(file, "%d", &students[i].English);
  }
  fclose(file);
  file = NULL;
}
void DisPlayData()
{
  int i = 0;
  for (i = 0; i < 7; i++)
  {
    printf("%s\t", students[i].name);
    printf("%d\t", students[i].Chinese);
    printf("%d\t", students[i].Math);
    printf("%d\t", students[i].English);
    printf("%d\n", students[i].Chinese + students[i].Math + students[i].English);
  }
}
int cmp(const void* a, const void* b)
{
  Student* pa = (Student*)a;
  Student* pb = (Student*)b;
  int num3 = pa->Chinese+pa->English+pa->Math;
  int num4 = pb->Chinese+pb->Chinese+pb->Math;
  return num3 - num4;
}
int main()
{
  readData();
  qsort(students, 7, sizeof(Student), cmp);
  DisPlayData();
  return 0;
}

5.png

目录
相关文章
|
6天前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
6天前
|
C语言 C++
|
3天前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
|
3天前
|
存储 安全 编译器
C语言中的scanf函数
C语言中的scanf函数
|
3天前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
3天前
|
C语言
C语言中的无参函数
C语言中的无参函数
|
6天前
|
C语言
C语言------函数
这篇文章是C语言中函数的实训,涵盖了函数的定义、调用、自定义函数编写以及递归调用方法,并通过多个示例代码演示了如何实现累加、阶乘、斐波那契数列、特殊数列求和等函数功能。
C语言------函数
|
6天前
|
编译器 C语言
【C语言小知识】ctype.h系列的字符函数
【C语言小知识】ctype.h系列的字符函数
|
6天前
|
存储 程序员 编译器
[C语言]函数
[C语言]函数
|
11天前
|
编译器 C语言
C语言函数的学习
掌握函数的使用是学习C语言的关键一环,理解和应用这些基本的函数概念将使你能够更有效地利用C语言的强大功能。
7 0