qsort函数专题

简介: qsort函数专题

qsort使用练习:练习使用库函数,qsort排序各种类型的数据

排序整型数据

# define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>     /* qsort */
int int_cmp(const void* p1, const void* p2)
{
  return (*(int*)p1 - *(int*)p2);//将void*类型转化为int*类型,并将其解引用
}
int main()
{
  int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
  int i = 0;
  qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);//(首元素地址,元素个数,字节数,比较函数)
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
  return 0;
}

排序结构体

按照年龄比较

# define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>     /* qsort */
struct Stu
{
  char name[20];
  int age;
};
int cmp_by_age(const void* e1, const void* e2)
{
  return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void test()
{
  struct Stu s[] = { {"zhangsan",20},{"lisi",19},{"wangwu",30} };
  int sz = sizeof(s) / sizeof(s[0]);
  qsort(s, sz, sizeof(s[0]), cmp_by_age);
}
int main()
{
  test();
  return 0;
}

按照姓名比较

# define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>     /* qsort */
#include<string.h>
struct Stu
{
  char name[20];
  int age;
};
int cmp_by_name(const void* e1, const void* e2)
{
  return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test()
{
  struct Stu s[] = { {"zhangsan",20},{"lisi",19},{"wangwu",30}};
  int sz = sizeof(s) / sizeof(s[0]);
  qsort(s, sz, sizeof(s[0]), cmp_by_name);
}
int main()
{
  test();
  return 0;
}

qsort模拟实现:模仿qsort的功能实现一个通用的冒泡排序

# define _CRT_DEFINE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>     /* qsort */
#include<string.h>
int int_cmp(const void* p1, const void* p2)
{
  return (*(int*)p1 - *(int*)p2);
}
void swap(void* p1, void* p2, int size)
{
  int i = 0;
  for (i = 0; i < size; i++)
  {
    char tmp = *((char*)p1 + i);
    *((char*)p1 + i) = *((char*)p2 + i);
    *((char*)p2 + i) = tmp;
  }
}
void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{
  int i = 0;
  int j = 0;
  for (i = 0; i < count - 1; i++)//冒泡排序
  {
    for (j = 0; j < count - i - 1; j++)
    {
      if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
      {
        swap((char*)base + j * size, (char*)base + (j + 1) * size, 4);
      }
    }
  }
}
int main()
{
  int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
  int i = 0;
  bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}
相关文章
单细胞分析|映射和注释查询数据集
单细胞分析|映射和注释查询数据集
|
运维 网络协议 安全
小白带你学习linux的防火墙
小白带你学习linux的防火墙
413 1
|
开发工具 Android开发 git
Git(2) 实用技巧:打包、补丁、环境切换、修改记录和加速
Git实用技巧包括:打包差异文件或补丁、在Git和Repo环境间切换、批量修改提交记录中的用户名和邮箱、设置Git命令别名以及解决下载速度慢和超时问题。这些技巧能提升Git使用效率和便捷性。
439 0
|
存储 缓存 Java
浅析JAVA日志中的几则性能实践与原理解释
本篇文章通过几个技术点说明日志记录过程中的性能实践,计算机领域的性能往往都遵循着冰山法则,即你能看得见的、程序员能感知的只是其中的一小部分,还有大量的细节隐藏在冰山之下。
|
6月前
|
网络协议 Android开发 数据安全/隐私保护
三色过人脸虚拟摄像头,安卓免root虚拟摄像头, 安卓虚拟摄像头过人脸
这个实现包含三个主要部分:虚拟摄像头核心服务、安卓环境配置脚本和客户端测试程序
|
存储 设计模式 缓存
从一个 NullPointerException 探究 Java 的自动装箱拆箱机制
这行代码一个对象方法都没有调用,怎么会抛出 NullPointerException 呢?
159 9
|
缓存 自然语言处理 API
Ascend推理组件MindIE LLM
MindIE LLM是基于昇腾硬件的大语言模型推理组件,提供高性能的多并发请求调度与优化技术,如Continuous Batching、PageAttention等,支持Python和C++ API,适用于高效能推理需求。其架构包括深度定制优化的模型模块、文本生成器和任务调度管理器,支持多种模型框架和量化方式,旨在提升大规模语言模型的推理效率和性能。
|
SQL 存储 数据管理
一篇文章带你掌握SQLite3基本用法
通过本文的介绍,希望您能深入理解SQLite3的基本用法,并在实际开发中灵活运用这些知识,提升数据管理效率。
1685 5
|
开发工具 git
github clone Failed to connect to github.com port 443 after xxx ms
github clone Failed to connect to github.com port 443 after xxx ms
1772 2
|
SQL 分布式计算 Serverless
阿里云 EMR Serverless Spark 版正式开启商业化
阿里云 EMR Serverless Spark 版正式开启商业化,内置 Fusion Engine,100% 兼容开源 Spark 编程接口,相比于开源 Spark 性能提升300%;提供 Notebook 及 SQL 开发、调试、发布、调度、监控诊断等一站式数据开发体验!
543 3
阿里云 EMR Serverless Spark 版正式开启商业化