当前位置: 首页 > backend >正文

qsort函数的用法

一、qsort函数介绍

  1. 所属库函数:<stdlib.h>
  2. 参数:
  • 第一个参数是所要排序的数组。
  • 第二个参数是一共有多少个数据要进行排序。
  • 第三个参数是每个数据的类型为多少字节。
  • 第四个参数是函数指针,需要自己写一个比较函数。

     3.返回值:void

注:比较函数的返回值是int类型,如果返回值为>0的数,则为降序,<0为升序。

二、qsort函数的基本用法

2.1、对int类型排序

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_int(const void* f1, const void* f2)
{//降序return *(int*)f1 - *(int*)f2;
}
void test1()
{int arr[] = { 5,6,9,8,2,1,4 };int sz1 = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz1, sizeof(int), cmp_int);for (int i = 0; i < sz1; i++)cout << arr[i] << " ";cout << endl;
}
int main()
{test1();return 0;
}

打印结果:

2.2、对实型(double,float)排序

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_double(const void* f1, const void* f2)
{double diff = *(double*)f1 - *(double*)f2;if (diff > 0) return 1;else if (diff == 0) return 0;else return -1;
}
void test2()
{double brr[] = { 1.5,5.2,4.6,8.6,8.4 };int sz2 = sizeof(brr) / sizeof(brr[0]);qsort(brr, sz2, sizeof(double), cmp_double);for (int i = 0; i < sz2; i++)cout << brr[i] << " ";cout << endl;
}
int main()
{test2();return 0;
}

打印结果:

2.3、对字符数组排序

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_str(const void* f1, const void* f2)
{return strcmp((char*)f1, (char*)f2);
}
void test3()
{char words[][10] = { "eyfg","thrt","trwh","dsfr" };int sz3 = sizeof(words) / sizeof(words[0]);qsort(words, sz3, sizeof(words[0]), cmp_str);for (int i = 0; i < sz3; i++)cout << words[i] << " ";cout << endl;
}
int main()
{test3();return 0;
}

打印结果:

2.4、对结构体成员排序

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef struct stu
{char name[20];int age;
}stu;
int cmp_by_age(const void* f1, const void* f2)
{return ((stu*)f1)->age - ((stu*)f2)->age;
}
int cmp_by_name(const void* f1, const void* f2)
{return strcmp(((stu*)f1)->name, ((stu*)f2)->name);
}
void test4()
{stu people[] = { {"hjegf", 58}, {"yagfe", 54} };int sz4 = sizeof(people) / sizeof(people[0]);qsort(people, sz4, sizeof(stu), cmp_by_age);for (int i = 0; i < sz4; i++)cout << people[i].age << " ";cout << endl;qsort(people, sz4, sizeof(stu), cmp_by_name);for (int i = 0; i < sz4; i++)cout << people[i].name<< " ";cout << endl;
}
int main()
{test4();return 0;
}

打印结果:

2.5、对指针数组排序

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int cmp_str_ptr(const void* f1, const void* f2) 
{return strcmp(*((char**)f1), *((char**)f2));
}
void test5()
{//字面量不可修改,用constconst char* words[] = { "banana", "apple", "cherry" };int sz5 = sizeof(words) / sizeof(words[0]);qsort(words, sz5, sizeof(char*), cmp_str_ptr);for (int i = 0; i < sz5; i++)cout << words[i] << " ";cout << endl;
}
int main()
{test5();return 0;
}

打印结果:

三、qsort函数模拟实现

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
#include <stdio.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, size); } } } 
}
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]); }printf("\n"); return 0; 
}

ps:由于实现者并不知道你所要比较的数据类型是什么,所以设计成char*的比较形式,按最小字节来进行比较(大小端也有类似用法)。

http://www.xdnf.cn/news/3766.html

相关文章:

  • MySQL 日期加减函数详解
  • 61常用控件_QDateTimeEdit的使用
  • 用Maven定位和解决依赖冲突
  • 研究主题:聊天机器人使用与情感纽带的形成
  • 归并排序【逆序对】
  • 【AI面试准备】数据驱动测试思维与实践指南
  • 使用Node.js搭建https服务器
  • 《Windows 环境下 Qt C++ 项目升级 GCC 版本的完整指南》
  • 如何在WORD WPS中输入英语音标 批量给英语标注音标
  • 【堆】最大堆、最小堆以及GO语言的实现
  • Redis从入门到实战实战篇2
  • 智能家居的OneNet云平台
  • Linux进程间通信(二)之管道1【匿名管道】
  • 【2025软考高级架构师】——数据库系统(10)
  • SpringBoot上传文件到阿里云OSS对象存储
  • 数据赋能(211)——质量管理——数据可验证性原则
  • 【Mytais系列】介绍、核心概念
  • 【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
  • C++ 抽象工厂模式详解
  • [Vue]编程式导航
  • C++ 单例模式详解
  • React18组件通信与插槽
  • 数模竞赛的坑,你踩了几个?
  • 源码编译Qt StateMachine
  • 如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi?
  • 力扣面试150题--二叉树的最大深度
  • 最大子段和 Java
  • 【计算机网络-应用层】解析HTTP会话保持:Cookie与Session的原理与实践
  • 学习黑客网络安全法
  • 26考研 | 王道 | 计算机网络 | 第三章 数据链路层