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 是一个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排序的介绍与使用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函数是一种根据指定模式进行排序的函数,是一个快速排序算法,它可以实现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函数原型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.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功能: 使用快速排序例程进行排序用法: 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函数⽤法最近在刷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);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}。