qsort函数的用法

合集下载

qsort 用法

qsort 用法

qsort 用法qsort 是一个C库函数,用于对数组进行快速排序。

它可以按照特定的比较函数,对数组中的元素进行排序。

以下是关于 qsort 函数的一些用法:1. 函数原型:```cvoid qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));```- base:指向待排序数组的首个元素的指针。

- nitems:待排序数组中元素的个数。

- size:每个元素的字节大小。

- compar:用户自定义的比较函数。

2. 比较函数的定义:比较函数用于定义排序的方式,它必须满足以下规则:- 如果第一个元素小于第二个元素,则返回一个负数。

- 如果第一个元素大于第二个元素,则返回一个正数。

- 如果两个元素相等,则返回零。

比较函数的原型如下:```cint compar(const void *a, const void *b);3. 示例用法:假设我们有一个整型数组,需要按从小到大的顺序进行排序。

下面是一个示例代码:```c#include <stdio.h>#include <stdlib.h>// 比较函数int compar(const void *a, const void *b) {return (*(int*)a - *(int*)b);}int main() {int arr[] = {9, 5, 2, 7, 1};int n = sizeof(arr) / sizeof(arr[0]);// 使用 qsort 对数组进行排序qsort(arr, n, sizeof(int), compar);// 打印排序后的数组for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;```输出结果:```1 2 5 7 9```在上面的示例中,我们首先定义了一个比较函数 `compar`,该函数按照从小到大的顺序对整数进行比较。

c qsort原函数 -回复

c qsort原函数 -回复

c qsort原函数-回复c qsort原函数是C语言中的一个排序函数,即快速排序函数,广泛应用于各种排序场景中。

快速排序是一种高效的排序算法,其时间复杂度为O(nlogn),对于大规模的数据排序非常高效,因此被广泛应用。

首先,我们来介绍一下qsort函数的基本用法。

在C语言中,qsort函数位于stdlib.h头文件中,并且被定义为以下原型:void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));其中,参数base是一个指向要排序的数组的指针,参数num是数组中元素的个数,参数size是数组中每个元素的大小(以字节为单位),参数compar是一个指向比较函数的指针。

qsort函数通过对数组中的元素进行比较,并按照比较结果进行排序。

排序需要使用到参数compar指向的比较函数,比较函数的形式如下:int compar(const void *a, const void *b);比较函数需要返回一个整数值,如果返回值小于0,则表示a小于b;如果返回值等于0,则表示a等于b;如果返回值大于0,则表示a大于b。

下面我们来详细解释一下qsort函数的使用步骤。

步骤一:引入必要的头文件在使用qsort函数之前,需要引入头文件stdlib.h。

可以使用以下方式引入:#include <stdlib.h>步骤二:编写比较函数根据实际需求,需要编写一个比较函数,用于指定排序的规则。

比较函数的定义类似于以下形式:int compare(const void *a, const void *b) {比较逻辑}比较函数需要根据实际需要进行定义,比如可以根据元素的大小进行比较,或者根据元素的其他属性进行比较。

步骤三:调用qsort函数进行排序在比较函数编写完成后,可以通过调用qsort函数进行排序。

qsort函数

qsort函数

qsort函数qsort函数是C语言中常用的排序算法之一,它属于快速排序算法,它可以很快地对数组进行排序。

qsort函数的历史可以追溯到1960年代的“快速排序”,当时由爱德华诺夫斯基(EdwardNofsk)提出。

它的原理是,首先在数组中选取一个基准值,然后把所有小于等于基准值的元素放在基准值左边,把所有大于等于基准值的元素放在基准值右边,最后递归地把每个子数组再排序,直到所有的元素都排序完毕。

qsort函数的实现非常简单,只需要定义一个带有四个参数的函数qsort,第一个参数是要排序的数组,第二个参数是数组的元素个数,第三个参数是元素的大小,最后一个参数是用于比较两个元素值的函数。

在实现qsort函数过程中,可以使用递归思想,每次使用一个基准值,把数组中元素分成两部分,分别对其中的元素进行排序,最终实现快速排序。

qsort函数的优势在于它简单易懂,而且在空间复杂度上也比较低,可以达到O(logn),它是一个时间复杂度较低的排序算法,可以实现大量数据的排序,是许多编程语言的核心函数之一,广泛应用于各种应用场景,如搜索引擎、系统工具、数据可视化等。

qsort函数的应用也是十分普遍的,它可以用于排序数组,也可以用于排序链表,同时支持比较函数的自定义,可以根据业务需求定制不同的排序方式,同时还可以作为数据校验的处理过程,可以用来检索并对大量数据进行排序。

qsort函数也有一些缺点,因为在实现快速排序时,使用递归思想,有可能造成堆栈溢出,另外它没有最优比较结构,如果数据集中在一个范围值的话,它的排序效率有可能会变得很低,因此使用者需要仔细分析和调配,获取最佳性能。

qsort函数是当今C语言常用的排序算法之一,它可以实现快速排序,可以快速地对数组进行排序,而且它还支持比较函数的自定义,可以根据业务需求实现不同的排序方式。

但是也有其缺点,需要注意并适度使用,以达到最佳性能。

C++排序函数sort(),qsort()的用法

C++排序函数sort(),qsort()的用法

C++排序函数sort(),qsort()的⽤法想起来⾃⼰天天排序排序,冒泡啊,⼆分查找啊,结果在STL中就⾃带了排序函数sort,qsort,总算把⾃⼰解脱了~所以⾃⼰总结了⼀下,⾸先看sort函数见下表:sort对给定区间所有元素进⾏排序stable_sort对给定区间所有元素进⾏稳定排序partial_sort对给定区间所有元素部分排序partial_sort_copy对给定区间复制并排序nth_element找出给定区间的某个位置对应的元素is_sorted判断⼀个区间是否已经排好序partition使得符合某个条件的元素放在前⾯stable_partition相对稳定的使得符合某个条件的元素放在前⾯要使⽤此函数只需⽤#include <algorithm> sort即可使⽤,语法描述为:sort(begin,end),表⽰⼀个范围,例如:int _tmain(int argc, _TCHAR* argv[]){int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20);for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;}输出结果将是把数组a按升序排序,说到这⾥可能就有⼈会问怎么样⽤它降序排列呢?这就是下⼀个讨论的内容.⼀种是⾃⼰编写⼀个⽐较函数来实现,接着调⽤三个参数的sort:sort(begin,end,compare)就成了。

对于list容器,这个⽅法也适⽤,把compare作为sort的参数就可以了,即:sort(compare).1)⾃⼰编写compare函数:bool compare(int a,int b){return a<b; //升序排列,如果改为return a>b,则为降序}int _tmain(int argc, _TCHAR* argv[]){int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,compare);for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;}2)更进⼀步,让这种操作更加能适应变化。

C语言标准库函数 qsort 详解

C语言标准库函数 qsort 详解

C语言标准库函数 qsort 详解qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。

排序之后的结果仍然放在原数组中。

使用qsort函数必须自己写一个比较函数。

函数原型:void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );用法以及参数说明:Sorts the num elements of the array pointed by base, each element size bytes long, using the comparator function to determine the order.The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements of the array.The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.base Pointer to the first element of the array to be sorted.(数组起始地址)num Number of elements in the array pointed by base.(数组元素个数) size Size in bytes of each element in the array.(每一个元素的大小) comparator Function that compares two elements.(函数指针,指向比较函数) 1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.Return Value none (无返回值)一、对int类型数组排序int num[100];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];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 Sample{double data;int other;}s[100]//按照data的值从小到大将结构体排序int cmp( const void *a ,const void *b){return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1; }qsort(s,100,sizeof(s[0]),cmp);五、对结构体二级排序struct Sample{int x;int y;}s[100];//按照x从小到大排序,当x相等时按照y从大到小排序int cmp( const void *a , const void *b ){struct Sample *c = (Sample *)a;struct Sample *d = (Sample *)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 Sample{int data;char str[100];}s[100];//按照结构体中字符串str的字典顺序排序int cmp ( const void *a , const void *b ){return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str ); }qsort(s,100,sizeof(s[0]),cmp);附加一个完整点的代码,对字符串二维数组排序:#include <stdio.h>#include <stdlib.h>#include <string.h>char s[2001][1001];int cmp(const void *a, const void *b){ return strcmp((char *)a,(char *)b); }int main(){int i,n;scanf("%d",&n);getchar();for(i=0;i<n;i++) gets(s[i]);qsort(s,n,1001*sizeof(char),cmp); for(i=0;i<n;i++) puts(s[i]);return 0;}。

qsort 用法 -回复

qsort 用法 -回复

qsort 用法-回复QSort是一种常见的排序算法,也称为快速排序。

它是一种分治策略的排序算法,通常比较高效,在实践中被广泛使用。

以下是一篇关于QSort用法的1500-2000字文章,逐步回答。

QSort是一种基于比较的内部排序算法,在大多数情况下运行时间是O(nlogn)。

它通过将数组分成较小的子数组并逐步排序这些子数组来工作。

QSort的名字来自于它的排序过程中,快速地将数组分割成两个部分。

首先我们需要了解一些基本概念。

在排序算法中,我们需要比较元素的大小,这可以通过元素之间的某种关系来实现,例如元素可以是数字、字符串或其他可比较的对象。

在QSort中,我们使用一个称为“比较器”的函数来确定元素之间的比较方式。

使用QSort进行排序的第一步是选择一个称为“主元”的元素。

该元素将在排序过程中作为参考值,其他元素将与它进行比较和排序。

通常情况下,我们选择数组的第一个或最后一个元素作为主元,但也可以选择其他元素。

选择主元的方式对算法的性能有一定的影响。

一旦选择了主元,我们将数组分为两个部分,同时建立两个指针。

第一个指针从数组的左侧开始,往右扫描数组,找到一个大于或等于主元的元素。

第二个指针从数组的右侧开始,往左扫描数组,找到一个小于或等于主元的元素。

这样,我们得到了两个指针指向的元素,它们需要在排序后的数组中交换位置。

一旦指针交汇,我们就可以确定主元在排序后数组的位置。

将主元元素放置在这个位置,并分别对主元的左侧和右侧进行递归排序。

这个过程叫做快速排序的分割阶段。

递归排序的基本思想是,如果一个数组可以正确地排序并且可以将它分成两个较小的数组进行排序,那么整个数组也可以正确地排序。

这种思想被称为分治策略。

在QSort中,我们将数组分割成两个较小的子数组,并分别对它们进行排序。

在递归过程中,我们继续选择主元并分割数组,直到只剩下一个元素或者子数组为空。

当数组只剩下一个元素时,我们可以认为它已经被排序了。

qsort函数使用方法总结(详细全面+代码)

qsort函数使用方法总结(详细全面+代码)

qsort函数使⽤⽅法总结(详细全⾯+代码)⽬录qsort函数原型void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *)); 头⽂件:<stdlib.h> 函数功能:qsort()函数的功能是对数组进⾏排序,数组有nmemb个元素,每个元素⼤⼩为size。

参数base - base指向数组的起始地址,通常该位置传⼊的是⼀个数组名 参数nmemb - nmemb表⽰该数组的元素个数 参数size - size表⽰该数组中每个元素的⼤⼩(字节数) 参数(*compar)(const void *, const void *) - 此为指向⽐较函数的函数指针,决定了排序的顺序。

函数返回值:⽆ 注意:如果两个元素的值是相同的,那么它们的前后顺序是不确定的。

也就是说qsort()是⼀个不稳定的排序算法。

compar参数 compar参数是qsort函数排序的核⼼内容,它指向⼀个⽐较两个元素的函数,注意两个形参必须是const void *型,同时在调⽤compar 函数(compar 实质为函数指针,这⾥称它所指向的函数也为compar)时,传⼊的实参也必须转换成const void *型。

在compar函数内部会将const void *型转换成实际类型,见下⽂。

int compar(const void *p1, const void *p2); 如果compar返回值⼩于0(< 0),那么p1所指向元素会被排在p2所指向元素的前⾯ 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定 如果compar返回值⼤于0(> 0),那么p1所指向元素会被排在p2所指向元素的后⾯ 因此,如果想让qsort()进⾏从⼩到⼤(升序)排序,那么⼀个通⽤的compar函数可以写成这样:int compare (const void * a, const void * b){if ( *(MyType*)a < *(MyType*)b ) return -1;if ( *(MyType*)a == *(MyType*)b ) return 0;if ( *(MyType*)a > *(MyType*)b ) return 1;} 注意:你要将MyType换成实际数组元素的类型。

C语言qsort函数的简介和用法,保证简洁明了!

C语言qsort函数的简介和用法,保证简洁明了!
• //按照结构体中字符串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()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
• 应用qsort对int数组进行排序:
• #include <stdio.h>
• #include <stdlib.h>
• int cmp_1 ( int *a , int *b )
•{
• return *a - *b;
•}
• int cmp_2 ( int *a , int *b )
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为:
• void qsort(void *base,size_t nelem,size_t width, cmp);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

六类qsort排序方法以下是其具体分类及用法(若无具体说明是以降序排列):1、对一维数组排序:(Element_type是一位数组中存放的数据类型,可以是char, int, float, double, etc )使用qsort之前,必须自己定义一个比较函数。

这个比较函数用于比较两个元素的大小。

由于qsort可以排序任意数据类型,包括自定义的结构类型,因此,做一个自定义的比较函数是必要的。

int Comp(const void *p1,const void *p2 ) {return *((Element_type *)p2) > *((Element_type *)p1) ? 1 : -1;}int main(){Element_type list[MAX];initial(list);qsort(list, sizeof(list),sizeof(Element_type),Comp);// qsort的4个参数:数组的首地址、数组的实际大小,元素的实际大小,比较函数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 ? 1 : -1; }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。

我的:用qsort快两年的时候了,却一直没有真正弄懂cmp函数的返回值1,-1,0的函数. 今天在做凸包时,郁闷了...cmp返回值的意识:int cmp(const void *a, const void *b)返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 0, 那就无所谓谁前谁后..很多人问这个东西.我以前也看了好久,今天翻到以前学快排的时候写的练习code,基本上能覆盖绝大部分用法了.里面有很多地方没判断相等的情况,按道理来说相等情况下应该返回0的,这个请看代码的时候注意.我尽量保证代码不出错了.下面的这些说明和问题都是个人原创,没查什么资料,所以不保证其完全正确性,在此表示个人不对出现的问题负任何责任,大家WA了或者干吗的不要怪我,不过至少目前来说我用起来是没问题的 :)/*----------------------------------------------------------------------------*/** 关于快排函数的一些说明 **qsort,包含在stdlib.h头文件里,函数一共四个参数,没返回值.一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式,这个问题下面有说明); 第二个参数是参与排序的元素个数; 第三个三数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式,下面也有说明 :) ;第四个参数就是很多人觉得非常困惑的比较函数啦,关于这个函数,还要说的比较麻烦...我们来讨论cmp这个比较函数(写成cmp是我的个人喜好,你可以随便写成什么,比如qcmp什么的).典型的cmp的定义是int cmp(const void *a,const void *b);返回值必须是int,两个参数的类型必须都是const void *,那个a,b是我随便写的,个人喜好. 假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回 0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序.在函数体内要对a,b进行强制类型转换后才能得到正确的返回值,不同的类型有不同的处理方法.具体情况请参考后面的例子./*----------------------------------------------------------------------------*/** 关于快排的一些小问题 **1.快排是不稳定的,这个不稳定一个表现在其使用的时间是不确定的,最好情况(O(n))和最坏情况(O(n^2))差距太大,我们一般说的O(nlog(n))都是指的是其平均时间.2.快排是不稳定的,这个不稳定表现在如果相同的比较元素,可能顺序不一样,假设我们有这样一个序列,3,3,3,但是这三个3是有区别的,我们标记为3a,3b,3c,快排后的结果不一定就是3a,3b,3c这样的排列,所以在某些特定场合我们要用结构体来使其稳定(No.6的例子就是说明这个问题的)3.快排的比较函数的两个参数必须都是const void *的,这个要特别注意,写a和b只是我的个人喜好,写成cmp也只是我的个人喜好.推荐在cmp里面重新定义两个指针来强制类型转换, 特别是在对结构体进行排序的时候4.快排qsort的第三个参数,那个sizeof,推荐是使用sizeof(s[0])这样,特别是对结构体,往往自己定义2*sizeof(int)这样的会出问题,用sizeof(s[0)既方便又保险5.如果要对数组进行部分排序,比如对一个s[n]的数组排列其从s[i]开始的m个元素,只需要在第一个和第二个参数上进行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);/*----------------------------------------------------------------------------*/ ** 标程,举例说明 **No.1.手工实现QuickSort#include <stdio.h>int a[100],n,temp;void QuickSort(int h,int t){if(h>=t) return;int mid=(h+t)/2,i=h,j=t,x;x=a[mid];while(1){while(a[i]<x) i++;while(a[j]>x) j--;if(i>=j) break;temp=a[i];a[i]=a[j];a[j]=temp;}a[mid]=a[j];a[j]=x;QuickSort(h,j-1);QuickSort(j+1,t);return;}int main(){int i;scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&a[i]); QuickSort(0,n-1);for(i=0;i<n;i++) printf("%d ",a[i]); return(0);}No.2.最常见的,对int数组排序#include <stdio.h>#include <string.h>#include <stdlib.h>int s[10000],n,i;int cmp(const void *a, const void *b)return(*(int *)a-*(int *)b);}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d ",s[i]);return(0);}No.3.对double型数组排序,原理同int这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断, 所以这里只返回了1和-1#include <stdio.h>#include <stdlib.h>double s[1000];int i,n;int cmp(const void * a, const void * b){return((*(double*)a-*(double*)b>0)?1:-1);}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%lf",&s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%lf ",s[i]);return(0);}No.4.对一个字符数组排序.原理同int#include <stdio.h>#include <string.h>#include <stdlib.h>char s[10000],i,n;int cmp(const void *a,const void *b){return(*(char *)a-*(char *)b);}int main(){scanf("%s",s);n=strlen(s);qsort(s,n,sizeof(s[0]),cmp);printf("%s",s);return(0);}No.5.对结构体排序cmp函数里面先强制转换了类型,不要在return里面转,我也说不清为什么,但是这样程序会更清晰,并且绝对是没错的. 这里同样请注意double返回0的问题#include <stdio.h>#include <stdlib.h>struct node{double date1;int no;} s[100];int i,n;int cmp(const void *a,const void *b){struct node *aa=(node *)a;struct node *bb=(node *)b;return(((aa->date1)>(bb->date1))?1:-1);}int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i].no=i+1;scanf("%lf",&s[i].date1);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);return(0);}No.6.对结构体排序.加入no来使其稳定(即data值相等的情况下按原来的顺序排)#include <stdio.h>#include <stdlib.h>struct node{double date1;int no;} s[100];int i,n;int cmp(const void *a,const void *b){struct node *aa=(node *)a;struct node *bb=(node *)b;if(aa->date1!=bb->date1)return(((aa->date1)>(bb->date1))?1:-1);elsereturn((aa->no)-(bb->no));}int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i].no=i+1;scanf("%lf",&s[i].date1);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);return(0);}No.7.对字符串数组的排序(char s[][]型)#include <stdio.h>#include <string.h>#include <stdlib.h>char s[100][100];int i,n;int cmp(const void *a,const void *b){return(strcmp((char*)a,(char*)b));}int main(){scanf("%d",&n);for(i=0;i<n;i++) scanf("%s",s[i]);qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%s\n",s[i]);return(0);}No.8.对字符串数组排序(char *s[]型)#include <stdio.h>#include <string.h>#include <stdlib.h>char *s[100];int i,n;int cmp(const void *a,const void *b){ return(strcmp(*(char**)a,*(char**)b)); }int main(){scanf("%d",&n);for(i=0;i<n;i++){s[i]=(char*)malloc(sizeof(char*));scanf("%s",s[i]);}qsort(s,n,sizeof(s[0]),cmp);for(i=0;i<n;i++) printf("%s\n",s[i]);return(0);}9、计算几何中求凸包的cmpint cmp(const void *a, const void *b){TPoint *c = (TPoint *)a;TPoint *d = (TPoint *)b;double k = multi(*c, *d, point[0]); //p0c×p0d (若>0 说明c的极角小于d, 若<0, c的极角大于d)if( k< 0) return 1; // 若前面的大于后面的,返回1--- 表示升序(交换)else if(k == 0 && distance(*c, point[0]) < distance(*d, point[0]))return 1; // 把距离小的点排在前面else return -1;}11。

相关文档
最新文档