快速排序qsort函数用法

news/2024/5/19 23:23:50 标签: 快速排序

一、qsort函数简介

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。
 

功能: 使用快速排序例程进行排序

头文件:stdlib.h

用法

void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

参数: 1 待排序数组,排序之后的结果仍放在这个数组中
    2 数组中待排序元素数量
    3 各元素的占用空间大小(单位为字节)
       4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数

qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

如比较函数  int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

二、qsort中几种常见的比较函数cmp

(一)对int型数组排序

int num[100];
int cmp_int(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}

qsort(num,100,sizeof(num[0]),cmp_int); 

可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

(二)对char型数组排序

char word[100];
int cmp_char(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;    //强制类型转换
    char* b = (char*)_b;
    return *a - *b;  
}

qsort(word,100,sizeof(word[0]),cmp_char); 

(三)对double型数组排序

double in[100];
int cmp_double(const void* _a , const void* _b)  //参数格式固定
{
    double* a = (double*)_a;    //强制类型转换
    double* b = (double*)_b;
    return *a > *b ? 1 : -1;   //特别注意
}

qsort(in,100,sizeof(in[0]),cmp_double); 

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系。

(四)对字符串进行排序

char word[100][10];
int cmp_string(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;  //强制类型转换
    char* b = (char*)_b;
    return strcmp(a,b);
}

qsort(word,100,sizeof(word[0]),cmp_string); 


http://www.niftyadmin.cn/n/1252747.html

相关文章

调度器锁rt_enter_critical() rt_exit_critical()

一、函数说明 void rt_enter_critical(void); /* 进入临界区*/ 调用这个函数后,调度器将被上锁。在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度…

RT Thread studio同时生成bin和hex文件

一、RTT默认生成bin文件 默认选择Raw binary,则项目对应的debug文件夹下生成bin文件; 修改成intel的话,则项目对应的debug文件夹下生产hex文件; 二、同时生成bin和hex文件 项目 属性-C/C构建-设置-构建步骤-命令 arm-none-ea…

使用CJSON 解析JSON 结构体数组【典型】

1.CJSON数据结构定义 #define cJSON_False 0 #define cJSON_True 1 #define cJSON_NULL 2 #define cJSON_Number 3 #define cJSON_String 4 #define cJSON_Array 5 //数组 #define cJSON_Object 6 //对象or单键名typedef struct cJSON {struct cJSON *next,*prev; /*遍历数…

RTThread:静态线程动态线程

一、静态线程创建 rt_thread_init rt_err_t rt_thread_init ( struct rt_thread * thread,const char * name,void(*)(void *parameter) entry,void * parameter,void * stack_start,rt_uint32_t stack_size,rt_uint8_t priority,rt_uint32_t tick )/** 初始化线程此…

C指针传参的一些思考

一、仅操作变量名的子函数,在主函数中无法真正实现值传递 如下: void swap_1(int num1, int num2) 作为主函数的子函数,被main函数调用; 在子函数内部实现了num1 和 num2的交换(子函数中加打印可看出)&a…

WSAStartup详解

在做计网课程设计“DNS中继服务器的实现”实验中,在相关代码中看到了该函数的出现,去网上查了下相关的资料,发现这个博主写的挺全的,是我需要的内容,因此特意转到这里,方便以后查看。 原博文链接 WSAStartu…

利用Tampermonkey写脚本抢课

利用Tampermonkey写脚本抢课 学校抢课…实在抢不到,于是想到了利用脚本不断刷新页面,来捡漏子。 听了实验室大神的推荐,选用了tampermonkey插件来写脚本。 在谷歌应用商店搜索tampermonkey并安装安装完后选择添加脚本绑定执行脚本的页面这…

leetcode#11.Container With Most Water

题目 Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container…