六类qsort排序方法

2024-08-26 09:32
文章标签 方法 排序 qsort 六类

本文主要是介绍六类qsort排序方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

六类qsort排序方法

前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。

以下是其具体分类及用法(若无具体说明是以降序排列):

1、对一维数组排序:

(Element_type是一位数组中存放的数据类型,可以是char, int, float, double, etc )

int Comp(const void *p1,const void *p2 )

{

return *((Element_type *)p2)-*((Element_type *)p1);

}

int main()

{

Element_type list[MAX];

initial(list);

qsort(list, sizeof(list),sizeof(Element_type),Comp);

return 0;

}

2、对字符串排序:

int Comp(const void *p1,const void *p2)

{

return strcmp((char *)p2),(char *)p1);

}

int main()

{

char a[MAX1][MAX2];

initial(a);

qsort(a,lenth,sizeof(a[0]),Comp);

//lenth 为数组a的长度

3、按结构体中某个关键字排序(对结构体一级排序):

struct Node

{

double data;

int other;

}s[100];

int Comp(const void *p1,const void *p2)

{

return (*(Node *)p2)->data-(*(Node *)p1)->data;

}

qsort(s,100,sizeof(s[0]),Comp);

4、按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:

struct Node

{

int x;

int y;

}s[100];

//按照x从小到大排序,当x相等时按y从大到小排序

int Comp(const void *p1,const void *p2)

{

struct Node *c = (Node *)p1;

struct Node *d = (Node *)p2;

if(c->x != d->x) return c->x-d->x;

else return d->y - c->y;

}

5、对结构体中字符串进行排序:

struct Node

{

int data;

char str[100];

}s[100];

//按照结构体中字符串 str 的字典序排序

int Comp(const void *p1,const void *p2)

{

return strcmp((*(Node *)p1)->str,(*(Node *)p2)->str);

}

qsort(s,100,sizeof(s[0],Comp);

6、计算几何中求凸包的Comp

//以下是俺从别人那儿抄来的,暂时还没用过

int Comp(const void *p1,const void *p2)

//重点Comp函数,把除了1点外的所有的点旋转角度排序

{

struct point *c=(point *)p1;

struct point *d=(point *)p2;

if( cacl(*c, *d,p[1]) < 0) return 1;

else if(!cacl(*c, *d, p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y ) )

//如果在一条直线上,则把远的放在前面

return 1;

else return -1;

}

P.S.:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分发写的,其时间复杂度为n*log(n),其结构为:

void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));

其中:

*base 为要排序的数组

nelem 为要排序的数组的长度

width 为数组元素的大小(一字结为单位)

(* Comp)(const void *p1,const void *p2) 为判断大小函数的指针,这个函数需要自己定义,如果p1>p2,函数返回-1;a<b,函数返回1;a==b函数返回0。

使用C++标准库的快速排序函数

tytzyl    发表于2009年03月25日 14:30 阅读(3) 评论(0) 分类: [url=javascript:;]个人日记 [/url]

[url=javascript:;]六类qsort排序方法 - 小熊 - justly@yeah 的博客举报[/url] 六类qsort排序方法 - 小熊 - justly@yeah 的博客 六类qsort排序方法 - 小熊 - justly@yeah 的博客 好久没有用快速排序了,虽然以前常用,但是现在由于专业的关系用的少了,但这并不能减少我对算法的热爱!

C++的标准库stdlib.h中提供了快速排序函数。

请在使用前加入对stdlib.h的引用:#include <cstdlib> 或 #include <stdlib.h>

qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))

参数表

*base: 待排序的元素(数组,下标0起)。

num: 元素的数量。

width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。

int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。

比较函数的返回值

返回值是int类型,确定elem1与elem2的相对位置。

elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。

控制返回值可以确定升序/降序。

一个升序排序的例程:

int Compare(const void *elem1, const void *elem2)

{

return *((int *)(elem1)) - *((int *)(elem2));

}

int main()

{

int a[100];

qsort(a, 100, sizeof(int), Compare);

return 0;

qsort中的const 关键字

TigerBlue    发表于2008年10月27日 21:50 阅读(22) 评论(0) 分类: [url=javascript:;]个人日记 [/url]来源:QQ邮箱

[url=javascript:;]六类qsort排序方法 - 小熊 - justly@yeah 的博客举报[/url] 六类qsort排序方法 - 小熊 - justly@yeah 的博客 六类qsort排序方法 - 小熊 - justly@yeah 的博客 cosnt char *p1; //p1 is a pointer to const char

char *const p2;// p2 is a const pointer to char

char * const *p3;// p3 is a pointer to const pointer to char

const * char *p4;// 没有这种用法。

void qsort(void *base, size_t nmemb, size_t size, int (*comp)(const void *, const void *));

static int (*comp)(const void *q1, const void *q2)

{

//真正传进来的是pointer to pointer to char,

         return strcmp(*(char * const *)q1, *(char * const *)q2);

//将char ** 转化为char * const *,然后求值,即为char * const ,argv的值是不允许改的,然后传给strcmp

}

而strcmp的原型为 int strcmp(const char *q3, const char *q4);

将char * const 转化为const char *,即 argv指向的字符串是不允许改的。

整个过程确保传进来的内容只读,不能修改,全靠 const这个关键字。

<本文中排序都是采用的从小到大排序>

一、对int类型数组排序

int num[100];

Sample:

int cmp ( const void *a , const void *b )

{

return *(int *)a - *(int *)b;

}

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

二、对char类型数组排序(同int类型)

char word[100];

Sample:

int cmp( const void *a , const void *b )

{

return *(char *)a - *(int *)b;

}

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

三、对double类型数组排序(特别要注意)

double in[100];

int cmp( const void *a , const void *b )

{

return *(double *)a > *(double *)b ? 1 : -1;

}

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

四、对结构体一级排序

struct In

{

double data;

int other;

}s[100]

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很

多种,参考上面的例子写

int cmp( const void *a ,const void *b)

{

return ((In *)a)->data > ((In *)b)->data ? 1 : -1;

}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct In

{

int x;

int y;

}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序

int cmp( const void *a , const void *b )

{

struct In *c = (In *)a;

struct In *d = (In *)b;

if(c->x != d->x) return c->x - d->x;

else return d->y - c->y;

}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct In

{

int data;

char str[100];

}s[100];

//按照结构体中字符串str的字典顺序排序

int cmp ( const void *a , const void *b )

{

return strcmp( (*(In *)a)->str , (*(In *)b)->str );

}

qsort(s,100,sizeof(s[0]),cmp);

七、计算几何中求凸包的cmp

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转

角度排序

{

struct point *c=(point *)a;

struct point *d=(point *)b;

if( calc(*c,*d,p[1]) < 0) return 1;

else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p

[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面

return 1;

else return -1;

}

PS:

其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里

 

这篇关于六类qsort排序方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108178

相关文章

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio