Qsort的使用

合集下载

qsort快速排序的整理

qsort快速排序的整理

qsort快速排序的整理最近⽤到了qsort,简单整理⼀下,⽅便以后的查找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);}/////////////////////////////////////////////////////////////////////////////////#include<iostream>#include <stdlib.h>using namespace std;int Comp(const void *p1,const void *p2){return *((int *)p2) - *((int *)p1);}int main(){int a[50],n,i;while(cin>>n){for(i=0;i<n;i++)cin>>a[i];qsort(a,n,sizeof(a[0]),Comp);for(i=0;i<n;i++)cout<<a[i]<<" ";}}/*六类qsort排序⽅法前⼀段时间做题觉得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排序的介绍与使用2007-05-22 19:24qsort函数包含在<stdlib.h>的头文件里。

qsort函数声明如下:void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));参数说明如下:base: 要排序的数组nmemb: 数组中的元素数目size: 每个数组元素占用内存空间,可使用sizeof获得compar: 比较两个数组元素的比较函数。

本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。

也就说你要实现一个这样的函数(升序):int cmp(const void *a, const void *b)如果a > b,返回>0如果a == b, 返回0如果a < b,返回<0这里的a和b的关系仅仅是逻辑上的,并不是值比较,所以排序的可以不仅仅是数字,还可以是字符。

<以下排序都是采用的从小到大排序>一、对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);对一个二维数组的进行排序:int a[1000][2]; 其中按照a[i][0]的大小进行一个整体的排序,其中a[i][1]必须和a[i][0]一起移动交换。

qsort(a,1000,sizeof(int)*2,comp);int comp(const void *a,const void *b){return ((int *)a)[0]-((int *)b)[0];}二、对char类型数组排序(同int类型)char word[100];Sample:int cmp( const void *a , const void *b){return *(char *)a - *(char *)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);七、计算几何中求凸包的cmpint 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;}众所周知,C语言中qsort是在一个数组中以升序对数据进行排序。

c语言qsort函数

c语言qsort函数

c语言qsort函数c语言qsort函数是一种根据指定模式进行排序的函数,是一个快速排序算法,它可以实现O(nlog(n))的最坏时间复杂度,并且可以使用少量的主调数据空间,是一种常用的排序算法。

c语言中的qsort函数是由ANSI C库中的函数 qsort()现的,该函数由C标准库提供,是属于stdlib.h头文件中的函数,用于根据指定排序规则对数组中的元素进行排序,可以实现快速地进行排序。

qsort()数的原型如下:void qsort (void *base, size_t num, size_t size, int(*compare)(const void *, const void *));它的参数如下:base:指向数组的指针num:数组中的元素数量size:每个数组元素的大小compare:指向函数的指针,用来比较两个元素的大小,比较的函数的返回值应当为一个整数,大于零则表示前一个元素大于后一个元素,小于零则表示前一个元素小于后一个元素,等于零则表示两个元素相等。

qsort()函数采用了快速排序算法来进行排序,它的基本原理是将数组中的元素划分为两个部分,左边的元素都小于右边的元素,再对两个部分分别调用qsort函数进行排序。

qsort函数的优点是可以快速排序,其算法复杂度定义如下:时间复杂度:O(nlog(n))空间复杂度:O(n)这意味着qsort函数可以在最差的情况下对一个元素数量为n的数组进行排序,时间复杂度为O(nlog(n)),空间复杂度为O(n)。

事实上,qsort()的时间复杂度在较小的数量级下,可用O(n^2)表示,这是因为每个元素都要消耗一定时间,即使用O(nlogn)的时间复杂度进行循环,也会出现时间复杂度为O(n^2)的情况。

如果要在C言中使用 qsort数,只需要包含 stdlib.h文件,并将数组名、元素的个数、元素的大小以及比较函数的指针作为参数传入即可:#include <stdlib.h>int a[10000];int compare (const void *a, const void *b) {return (*(int*)a - *(int*)b);}qsort(a, 10000, sizeof(int), compare);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原函数

c qsort原函数C语言中的qsort函数是一个用于快速排序的标准库函数。

它的原型如下:c.void qsort(void base, size_t nmemb, size_t size, int (compar)(const void , const void ));这个函数接受四个参数,下面我将逐个解释它们的含义:1. `void base`,指向待排序数组的指针,表示要排序的数据集合。

2. `size_t nmemb`,表示待排序数组的元素个数。

3. `size_t size`,表示每个元素的大小(以字节为单位)。

4. `int (compar)(const void , const void )`,函数指针,用于指定元素之间的比较方式。

`qsort`函数使用快速排序算法对数组进行排序。

快速排序是一种高效的排序算法,它的基本思想是通过递归地划分数组,将小于某个基准值的元素放在基准值的左边,大于基准值的元素放在基准值的右边,然后对左右两个子数组进行递归排序,最终得到有序的数组。

在`qsort`函数中,我们需要传入一个比较函数`compar`,用于指定元素之间的比较方式。

这个函数需要接受两个指向待比较元素的指针,并返回一个整数值来表示它们的大小关系。

具体来说,如果第一个元素小于第二个元素,比较函数应该返回一个负数;如果两个元素相等,比较函数应该返回0;如果第一个元素大于第二个元素,比较函数应该返回一个正数。

`qsort`函数会根据比较函数的返回值来确定元素的排序顺序。

通过不断地调用比较函数,`qsort`函数将数组中的元素进行比较和交换,最终实现排序的目的。

需要注意的是,`qsort`函数只能对一维数组进行排序,对于多维数组或结构体数组,需要自定义比较函数来指定元素之间的比较方式。

总结起来,`qsort`函数是一个用于快速排序的标准库函数,通过传入待排序数组的指针、元素个数、元素大小和比较函数,可以对数组进行排序。

快排函数qsort

快排函数qsort

快排函数qsort功能: 使用快速排序例程进行排序用法: void qsort ( void *base , int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址2 数组中待排序元素数量3 各元素的占用空间大小4 指向函数的指针,用于确定排序的顺序说明: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的例子就是说明这个问题的。

C语言中qsort函数用法

C语言中qsort函数用法

C语⾔中qsort函数⽤法最近在刷PAT时C语⾔中qsort函数的使⽤极多,所以在这⾥总结整理了⼀下,需要的朋友可以参考下。

qsort函数⽤法C语⾔中qsort函数的⽤法实例详解快速排序是⼀种⽤的最多的排序算法,在C语⾔的标准库中也有快速排序的函数,下⾯说⼀下详细⽤法。

qsort函数包含在<stdlib.h>中qsort函数声明如下:void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));参数说明:base,要排序的数组nmemb,数组中元素的数⽬size,每个数组元素占⽤的内存空间,可使⽤sizeof函数获得compar,指向函数的指针也即函数指针。

这个函数⽤来⽐较两个数组元素,第⼀个参数⼤于,等于,⼩于第⼆个参数时,分别显⽰正值,零,负值。

⽤法实例⼩结C语⾔中的qsort函数包含在<stdlib.h>的头⽂件⾥,排序默认都是采⽤的从⼩到⼤排序。

(如果要降序排序,只需将return⾥的a,b反过来写即可。

)⼀、对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 - *(char *)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 node{double one;int two;} s[100];完整代码struct node{double one;int two;} s[100];int cmp( const void *a ,const void *b){return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;}qsort(s,100,sizeof(s[0]),cmp);五、对结构体⼆级排序struct node{double one;int two;} s[100];//按照x从⼩到⼤排序,当x相等时按照y从⼤到⼩排序int cmp( const void *a , const void *b ){if((* (node * )a).one != ( * (node * )b).one)return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;else return (* (node * )a).two -( * (node * )b).two;}qsort(s,100,sizeof(s[0]),cmp);六、对字符串进⾏排序char am = { {"...."}, {"....."}, .....};//根据字符串⾸字母排序int cmp(const void *a, const void *b){return * (char *)a - *(char * )b;}qsort(a, m, sizeof(char * ) * n, cmp);char am = { {"...."}, {"....."}, .....};//根据字符串长度排序int cmp(const void *a, const void *b){return strlen((char * )a) > strlen((char * )b) ? 1 : -1;}qsort(a, m, sizeof(char * ) * n, cmp);char am = { {"...."}, {"....."}, .....};//按照结构体中字符串str的字典顺序排序int cmp(const void *a, const void *b){return (strcmp((char *)a, (char *)b));}qsort(a, m, sizeof(char * ) * n, cmp);七、计算⼏何中求凸包的cmpint 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)) //如果在⼀条直线上,则把远的放在前⾯}具体样例1.int类型数组排序#include<stdio.h>#include<stdlib.h>#define L 20int cmp(const void *a, const void *b){return *(int *)a - *(int *)b;}int main (){int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,11, 15, 14, 12, 13, 16, 17, 18, 19, 10};qsort(a, L, sizeof(int), cmp);for (int i = 0; i < L; i++){printf("%d ", a[i]);}}2.double类型数组排序#include<stdio.h>#include<stdlib.h>#define L 20int cmp(const void *a, const void *b){return *(double *)a > *(double *)b? 1 : -1;}int main (){double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8, 15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};qsort(a, L, sizeof(double), cmp);for (int i = 0; i < L; i++){printf("%.2lf\n", a[i]);}}3.char类型数组排序#include<stdio.h>#include<stdlib.h>#define L 20int cmp(const void *a, const void *b){return *(char *)a - *(char *)b;}int main (){char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l','o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};qsort(a, L, sizeof(char), cmp);for (int i = 0; i < L; i++){printf("%c ", a[i]);}}4.字符串进⾏排序按⾸字母排序#include<stdio.h>#include<stdlib.h>#define L 10#define K 10int cmp(const void *a, const void *b){return *(char *)a - *(char *)b;}int main (){char a[L][K] = {"rbsgc","jcghse","gfgd","abbbs","bbbvs","cbfgfe","ofggd","mbgcv",};qsort(a, L, sizeof(char) * K, cmp);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}按长度排序#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10#define K 10int cmp(const void *a, const void *b){return strlen((char *)a) > strlen((char *)b) ? 1 : -1; }int main (){char a[L][K] = {"rbsgc","jcghse","gfgd","abbbs","bbbvs","cbfgfe","drgafg" ,"ewqgrta","ofggd","mbgcv",};qsort(a, L, sizeof(char) * K, cmp);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}按字典顺序#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10#define K 10int cmp(const void *a, const void *b){return strcmp((char * )a, (char *)b);}int main (){char a[L][K] = {"rbsgc","jcghse","gfgd","abbbs","bbbvs","cbfgfe","drgafg" ,"ewqgrta","ofggd","mbgcv",};qsort(a, L, sizeof(char) * K, cmp);for (int i = 0; i < L; i++){printf("%s\n", a[i]);}}5.结构体⼆级排序#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 10typedef struct node {double first;int numb;}node;int cmp(const void *a, const void *b){if((* (node *)a).first != ( * (node *)b).first)return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1; else return (* (node * )a).numb -( * (node * )b).numb; }int main (){node arr[L] = {1.0, 1,2.0, 2,1.1, 3,2.1, 4,3.5, 5,1.0, 6,1.1, 7,5.1, 8,5.0, 9,3.6, 10,};qsort(arr, L, sizeof(node), cmp);for (int i = 0; i < L; i++){printf("%.2lf %d\n", arr[i].first, arr[i].numb);}}。

qsort(),sort()排序函数

qsort(),sort()排序函数

qsort(),sort()排序函数⼀.qsort()函数功能:使⽤快速排序例程进⾏排序头⽂件:stdlib.h⽤法:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));参数:1待排序数组⾸地址2数组中待排序元素数量3 各元素的占⽤空间⼤⼩4指向函数的指针,⽤于确定排序的顺序qsort(即,quicksort)主要根据你给的⽐较条件给⼀个快速排序,主要是通过指针移动实现排序功能。

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

其中qsort和compare的⽤法如下:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )int compare (const void *elem1, const void *elem2 ) ;1、对int类型数组排序compare函数:int compare(const void *a , const void *b ){return *(int *)a - *(int *)b; //升序排序//return *(int *)b - *(int *)a; //降序排序/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。

所以转型为你当前的类型,然后取值。

升序排列时,若第⼀个参数指针指向的“值”⼤于第⼆个参数指针指向的“值”,则返回正;若第⼀个参数指针指向的“值”等于第⼆个参数指针指向的“值”,则返回零;若第⼀个参数指针指向的“值”⼩于第⼆个参数指针指向的“值”,则返回负。

降序排列时,则刚好相反。

*/}测试实例:#include<iostream>#include<stdlib.h>using namespace std;int compare(const void *a,const void *b){return *(int*)b-*(int*)a; //降序排列}int main(){int a[ ]={2,4,1,23,5,76,0,43,24,65};int i;int length = sizeof(a)/sizeof(int);for(i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;qsort(a,length,sizeof(int),compare);for(i=0;i<length;i++)cout<<a[i]<<" ";cout<<endl;return 0;}2.对char类型数组排序(同int类型)char word[100];//注意,⽹上很多版本是 “ return *(char *)a - *(int *)b; ”//注意: *(int *)b是错误的⽤法//应该是return *(char *)a - *(char *)b;return *(char *)a - *(char *)b;}qsort(word,100,sizeof(word[0]),compare);3.对double类型数组排序double in[100];int compare( const void *a , const void *b ){return *(double *)a > *(double *)b ? 1 : -1;//返回值的问题,显然compare返回的是⼀个整型,所以避免double返回⼩数⽽被丢失,⽤⼀个判断返回值。

qsort及其用法

qsort及其用法

qsort及其用法一、函数原型void qsort(void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。

最后那个长长的家伙,给出了排序时比较元素的方式..再给一个例子:int a[n];qsort(a,n,sizeof(int),comp); //从小到大排序int comp(const void* a,const void *b){int *x=(int*)a;int *y=(int*)b;return *x-*y; //如果a>b返回正数,如果a<b,返回负数,相等返回0;}二、qsort用法1、对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);2、对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);3、对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);4、对结构体一级排序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);5、对结构体二级排序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);6、对字符串进行排序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);自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)int cmpstr(const void *a,const void *b){return strcmp((char*)a,(char*)b);}qsort(temp, j,sizeof(temp[0]),cmpstr);7、计算几何中求凸包的cmpint 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;}qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;sort()是STL中的标准算法。

qsort用法

qsort用法

qsort⽤法qsort包含在<stdlib.h>头⽂件中,此函数根据你给的⽐较条件进⾏快速排序,通过指针移动实现排序。

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

使⽤qsort函数必须⾃⼰写⼀个⽐较函数。

函数原型void qsort(void *base, size_t nelem, size_t width, int (*Comp)(const void *,const void *));函数⼀共四个参数,没返回值。

⼀个典型的qsort的写法如下:void 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的例⼦就是说明这个问题的)。

C语言qsort

C语言qsort

C语⾔qsortC/C++中有⼀个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为:void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *)); 使⽤该函数,可以对任何类型的⼀维数组排序。

该函数参数中,base 是待排序数组的起始地址,nelem 是待排序数组的元素个数,width 是待排序数组的每个元素的⼤⼩(以字节为单位),最后⼀个参数 pfCompare 是⼀个函数指针,它指向⼀个“⽐较函数”。

修改排序数组排序起始基地址和带排序元素个数可以实现数组部分排序。

qsort 函数的⽤法规定,“⽐较函数”的原型应是:int 函数名(const void * elem1, const void * elem2);该函数的两个参数,elem1 和elem2,指向待⽐较的两个元素。

也就是说, * elem1 和* elem2 就是待⽐较的两个元素。

该函数必须具有以下⾏为: 1) 如果 * elem1 应该排在 * elem2 前⾯,则函数返回值是负整数(任何负整数都⾏)。

2) 如果 * elem1 和* elem2 哪个排在前⾯都⾏,那么函数返回0 3) 如果 * elem1 应该排在 * elem2 后⾯,则函数返回值是正整数(任何正整数都⾏)。

例如:1 #include <iostream>2 #include <stdio.h>3 #include <stdlib.h>45using namespace std;67int compare(const void *a, const void *b)8 {9int *pa = (int*)a;10int *pb = (int*)b;11return (*pa )- (*pb); //从⼩到⼤排序12 }1314void main()15 {16int a[10] = {5, 6, 4, 3, 7, 0 ,8, 9, 2, 1};17 qsort(a, 10, sizeof(int), compare);18for (int i = 0; i < 10; i++)19 cout << a[i] << "" << endl;20 }View Code如果要从⼤到⼩排列,只需要将⽐较函数中return (*pa )- (*pb); 改为return (*pb )- (*pa); 即可。

qsort函数用法

qsort函数用法
这里关键要理解&这个符号
举个简单点的例子来说:
inta=10;
int&b=a;
这样b就和a完全一样啦
这个东东是相当好用的,比如我们想调用f(a,b,c)函数,并且希望对abc的值进行改变的话
。在c里面ms只可以用指针来实现。
但是用指针比较麻烦
有&这个符号就好用啦。
深入分析qsort库函数收藏
正如大家所知道的,快速排序算法是现在作为数据排序中很常用的算法,它集成在ANSI C的函数库中。我们经常使用快速排序,就是调用qsort函数,那么qsort函数里面到底是怎么实现的呢?我们现在就来看一看。
{
intn,m,i,j;
while(1)
{
scanf("%d%d",&n,&m);
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}
qsort((void*)a,n,sizeof(a[0]),cmp);
for(i=0;i<n;i++)
printf("%s\n",a[i]);
#include <stdlib.h>
#include <search.h>
#include <internal.h>
/*加快运行速度的优化选项*/
#pragmaoptimize("t", on)
/*函数原型*/
staticvoid __cdeclshortsort(char *lo, char *hi,size_twidth,

qsort

qsort

qsort()简介
2010-12-23
plutoyang@ 一、简介
qsort()包含在ANSI C库中,qsort()根据给定的比较条件、通过指针移动实现快速排序,排序之后的结果仍然放在原数组中。

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

C++ STL中有sort()函数,可视为qsort()的改进版本。

我们知道,在面对比较大的数组时,经过一定次数的快速排序迭代以后,数组已经基本有序,所以在运行插入排序的时候,只需要很少数量的比较和交换就可以完成排序。

sort()函数利用这一性质进行了算法优化,会根据数据量大小选择合适的排序算法,基本解决了qsort()在某些情况下会产生退化的问题。

二、使用说明
qsort()包含在stdlib.h头文件中,其函数原型如下:
对于comparison函数,有一下两点说明:
1)该函数有两个形参,两个形参均指向将用于比较的两个元素,这两个形参被强制转
换为void*. 在这个函数中,这两个形参将被重新类型转换为元素本身的类型,并且进行比较。

2)返回值为一个负值、0、正值,分别代表第一个元素与第二个元素的大小关系:小于,
等于,大于。

1.对int/char类型数组排序
2.对double类型数组排序
3.对结构体一级排序
4.对结构体二级排序
5.对字符串进行排序(字典序)
Tips:要准备记住compare函数的写法可能比较难,其实也可以写成C++的版本:
三、课后要求
自学STL容器,掌握基本操作:
顺序容器:vector, list
顺序容器适配器:stack, queue。

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;}。

C语言qsort函数用法

C语言qsort函数用法

C语⾔qsort函数⽤法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); 可见,参数列表是两个空指针,现在他要去指向你的数组元素。

qsort函数常见用法v1.1

qsort函数常见用法v1.1

qsort函数常见用法由于之前共享的qsort的资料和网上流传的一些关于qsort的资料确实有些问题,故根据个人的经历现将qsort的用法按我自己的理解整理了一下。

第一次写“学术”性质的东西,写得不好的地方还望大家多多包涵。

另外此篇文章系入门材料,留作以后的新人作为参考,各位老手可以跳过。

一、qsort函数简介qsort的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *cmp)(const void *, const void* ) ),所要包含的头文件为stdlib.h。

其中base是排序的一个集合数组,num是你需要进行排序的数组段的长度,width是你希望排序的数组元素的大小(一般用sizeof()来表示),cmp是一个比较函数,需要用户自己编写。

正是因为cmp的编写权交给了用户自己,因而它所能实现的功能便变得丰富起来。

下附一段简单的qsort的代码,用以辅助说明qsort的运行原理。

#include<stdio.h>#include<stdlib.h>#define SIZE 1000int a[SIZE];int cmp(const void *_p,const void *_q){int *p=(int *)_p;int *q=(int *)_q;return *p-*q;}int main(){int i=0,j;while(scanf("%d",&a[i])==1)i++;qsort(a,i,sizeof(a[0]),cmp);for(j=0;j<i;j++)printf("%d\n",a[j]);//system("pause");return 0;}上面的代码实现了将输入的整数进行升序排列并输出的功能。

C语言qsort用法

C语言qsort用法

C语言qsort用法qsort用法 C++sort的前身<qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里>一、对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 - *(char *)b;}qsort(word,100,sizeof(word[0]),cmp);三、对double类型数组排序 !!!!!!!!!!!!(特别要注意)double arry[100];int cmp( const void *a , const void *b ){return *(double *)a > *(double *)b ? 1 : -1;}qsort(arry,100,sizeof(arry[0]),cmp);四、对结构体一级排序struct In{double data;int other;}s[100];//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种int cmp( const void *a ,const void *b){struct In *c=(In *)a;struct In *d=(In *)b;return c->data > d->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 ){struct In *c = ( In *)a;struct In *d = (In *)b;return strcmp( c->str , d->str );}qsort(s,100,sizeof(s[0]),cmp);七、计算几何中求凸包的cmpint 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;}#include <stdio.h>#include <stdlib.h>int comp(const void *, const void *);int main(int argc, char *argv[]){int i;int array[] = {6, 8, 2, 9, 1, 0};qsort(array, 6, sizeof(int), comp);for (i = 0; i < 6; i ++) {printf("%d\t", array[i]);}printf("\n");return 0;}int comp(const void *p, const void *q) {return (*(int *)p - *(int *)q);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

qsort的使用
功能: 使用快速排序方法对数组进行排序
格式: void qsort(void *base, int nelem, int width, int (*fcmp));
参数说明:1 待排序数组首地址2 数组中元素个数3 各元素的占用空间大小4 指向函数的指针
头文件:c中stdlib.h
快速排序是目前公认的一种比较好的排序算法,比选择排序,冒泡排序都要快。

这是因为他速度很快,所以C也在库里实现这个算法,而sort是堆排序。

qsort 要求提供一个比较函数。

例如比较函数int MyCmp(const void* a, const void* b);函数都是两个参数,返回一个int 值,如果比较函数返回大于0(通常为1),qsort就认为a>b , 如果比较函数返回等于0,qsort 就认为a==b;返回小于零()(通常为-1),qsort就认为a《b)。

1、对int类型数组排序
int num[100];
int cmp ( const void *a , const void *b )
{ return *(int *)a - *(int *)b; }
qsort(num,100,sizeof(num[0]),cmp);
2、对char类型数组排序(同int类型)
char s[200];
int cmp( const void *a , const void *b )
{ return *(char *)a - *(int *)b; }
qsort(s,200,sizeof(word[0]),cmp);
3、对结构体类型数组排序
struct exam { int x; int y; } s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{ struct exam *c = (exam *)a; struct exam *d = (exam *)b;
if (c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
4、按对结构体中的字符串进行排序
struct exam { int data; char str[100]; } s[100];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{ return strcmp( (exam *)a->str , (exam *)b->str ); }
qsort(s,100,sizeof(s[0]),cmp);
5、按字符串数组进行排序
char s[100][20];
int cmp ( const void *a , const void *b )
{ return strcmp( (char *)a , (char *)b) ); }
qsort(s,100,sizeof(s[0]),cmp);
程序例1:
#include <stdio.h>
#include <stdlib.h>
int num[10]={1,5,6,3,4,8,7,9,2,0};
int cmp ( const void *a , const void *b ) { return *(int *)b - *(int *)a; }
int main(int argc, char *argv[])
{ int i;
qsort(num,10,sizeof(int),cmp);
for (i=0; i<10; i++)
printf("%5d",num[i]);
return 0;
}
程序例2:
#include <stdio.h>
#include <stdlib.h>
float num[10]={1.5,-6.3,4.8,-7.9,2.0}; int cmp ( const void *a , const void *b ) { return *(float *)a - *(float *)b; }
int main(int argc, char *argv[])
{ int i;
qsort(num,5,sizeof(float),cmp);
for (i=0; i<5; i++)
printf("%5.1f",num[i]);
return 0;
}
程序例3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[]="xsaytanbcdhsgy";
int cmp ( const void *a , const void *b ) { return *(char *)b - *(char *)a; }
int main(int argc, char *argv[])
{ int i;
qsort(s,sizeof(s),sizeof(char),cmp);
printf("%s",s);
return 0;
}
程序例4:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[10][6]={"abc","xyz","dbs","ads","gfg","aa","dsf","123","000","yy11"};
int cmp ( const void *a , const void *b )
{ return strcmp((char *)a , (char *)b); }
int main(int argc, char *argv[])
{ int i;
qsort(s,10,sizeof(s[0]),cmp);
for (i=0; i<10; i++)
printf("%s\n",s[i]);
return 0;
}
程序例5:
#include <stdio.h>
#include <stdlib.h>
struct exam { int x; int y; };
struct exam s[5]={ {51,12},{11,12},{41,20},{21,20},{10,20} };
int cmp( const void *a , const void *b )
{ struct exam *c = (exam *)a, *d = (exam *)b;
if (c->y != d->y) return c->y - d->y;
else return d->x - c->x;
}
int main(int argc, char *argv[])
{ int i;
qsort(s,5,sizeof(s[0]),cmp);
for (i=0; i<5; i++)
printf("(%d,%d)\n",s[i].x,s[i].y);
return 0;
}
程序例7:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct exam { char x[10]; int y; };
struct exam s[5]={ {"abcd",12},{"xyz",12},{"1234",20},{"XAZA",20},{"ABC",20} }; int cmp( const void *a , const void *b )
{ struct exam *c = (exam *)a, *d = (exam *)b;
return strcmp(d->x,c->x);
}
int main(int argc, char *argv[])
{ int i;
qsort(s,5,sizeof(s[0]),cmp);
for (i=0; i<5; i++)
printf("(%s,%d)\n",s[i].x,s[i].y);
return 0;
}。

相关文档
最新文档