1015 德才论 (25)(25 分)

#1015 德才论 (25)(25 分)

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”

现给出一批考生的德才分数,请根据司马光的理论给出录取排名。

输入格式:

输入第1行给出3个正整数,分别为:N(<=10^5^),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。

随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。

输出格式:

输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。

##输入样例:

114 60 80 210000001 64 90 310000002 90 60 410000011 85 80 510000003 85 80 610000004 80 85 710000005 82 77 810000006 83 76 910000007 90 78 1010000008 75 79 1110000009 59 90 1210000010 88 45 1310000012 80 100 1410000013 90 99 1510000014 66 60

##输出样例:

112 210000013 90 99 310000012 80 100 410000003 85 80 510000011 85 80 610000004 80 85 710000007 90 78 810000006 83 76 910000005 82 77 1010000002 90 60 1110000014 66 60 1210000008 75 79 1310000001 64 90

思考

c语言底下有algorithm这么方便的东西吗?

246-253页讲sort

GSview 6.0导出部分页pdf,再导出png,得到一页一页的png格式。

再配合chrome新浪微博图床插件,批量模式,一键复制markdown代码

c语言的cmp函数写法,与c++的cmp写法逻辑刚好相反,

c语言 return a>b,条件成立,则小的b在前,大的a在后,升序

c++如果return a>b,条件成立,则大的a在前,小的b在后,降序

AC代码

1#include <stdio.h> 2#include <string.h> 3#include <stdbool.h> 4#include <stdlib.h> 5//#include <algorithm> 6struct Student { 7 char id[10]; 8 int de, cai, sum; 9 int flag; 10}stu[100010]; 11int cmp(const void *a,const void *b) { 12 /*TDM-GCC 4.9.2 64-bit Release*/ 13 //struct Student* aa=(Student*)a; 14 //struct Student* bb=(Student*)b; 15 /*c(gcc)*/ 16// struct Student* aa=a;这里有PAT编译器和本地编译器的区别 17// struct Student* bb=b; 18 struct Student* aa=a; 19 struct Student* bb=b; 20 if(aa->flag != bb->flag) return (aa->flag > bb->flag)?1:-1;//类别小的在前面 21 else if(aa->sum != bb->sum) return (aa->sum < bb->sum)?1:-1; 22 else if(aa->de != bb->de) return (aa->de < bb->de)?1:-1;//到这没问题 23 else return strcmp(aa->id, bb->id); 24} 25int main() { 26 int n, L, H; 27 scanf("%d%d%d", &n, &L, &H); 28 int m = n; 29 for(int i = 0; i < n; i++) { 30 scanf("%s%d%d", stu[i].id, &stu[i].de, &stu[i].cai); 31 stu[i].sum = stu[i].de + stu[i].cai; 32 if(stu[i].de < L || stu[i].cai < L) { 33 stu[i].flag = 5; 34 m--; 35 } 36 else if(stu[i].de >= H && stu[i].cai >= H) stu[i].flag = 1; 37 else if(stu[i].de >= H && stu[i].cai < H) stu[i].flag = 2; 38 else if(stu[i].de >= stu[i].cai) stu[i].flag = 3; 39 else stu[i].flag = 4; 40 } 41 //sort(stu, stu + n, cmp); 42 /*void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));*/ 43 // int num = sizeof stu / sizeof (struct Student); 44 /*待排序的学生个数出问题了,num把开的数组所有元素都排序了一遍,是无意义的*/ 45 qsort(stu,n,sizeof (struct Student),cmp); 46 printf("%d\n", m); 47 for(int i = 0; i < m; i++) { 48 printf("%s %d %d\n", stu[i].id, stu[i].de, stu[i].cai); 49 } 50 return 0; 51}

胡凡讲sort

这里面讲了sort的方便的用法,可是纯c语言是不能写得这么方便的,要用指针。 c++用引用回避了指针,使入门更加简单。

c语言qsort例子

1/*int数组从小到大排序*/ 2#include <stdio.h> 3#include <stdlib.h> 4#include <limits.h> 5int compare_ints(const void* a, const void* b){ 6 int arg1 = *(const int*)a; 7 int arg2 = *(const int*)b; 8 if (arg1 < arg2) return -1; 9 if (arg1 > arg2) return 1; 10 return 0; 11 // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)} 12} 13int main(void){ 14 int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 }; 15 int size = sizeof ints / sizeof *ints; 16 qsort(ints, size, sizeof(int), compare_ints); 17 for (int i = 0; i < size; i++) { 18 printf("%d ", ints[i]); 19 } 20 printf("\n"); 21}

qsort函数、sort函数 (精心整理篇)

qsort函数、sort函数 (精心整理篇)

qsort函数、sort函数 (精心整理篇)

先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的。

首先说一下, qsort

qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。

具体介绍:-^^

1void qsort( void *base, size_t num, size_t width, int (__cdecl *compare ) 2 3int compare (const void *elem1, const void *elem2 ) );

qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。

参数意义如下:

第一个参数 base 是 需要排序的目标数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式)

第二个参数 num 是 参与排序的目标数组元素个数

第三个参数 width 是单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0])这样的表达式

第四个参数 compare 就是让很多人觉得非常困惑的比较函数啦。

我们来简单讨论compare这个比较函数(写成compare是我的个人喜好,你可以随便写成什么,比如 cmp 什么的,在后面我会一直用cmp做解释)。

典型的compare的定义是int compare(const void *a,const void *b);

返回值必须是int,两个参数的类型必须都是const void *,那个a,b是随便写的,个人喜好。假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序。

qsort 的使用方法:

一、对int类型数组排序

1int num[100]; 2int cmp ( const void *a , const void *b ) 3{ 4 return *(int *)a - *(int *)b; //升序排序 5//return *(int *)b - *(int *)a; //降序排序 6 7/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。 8 9 升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。 10 11 降序排列时,则刚好相反。 12 13*/ 14} 15 16qsort(s,n,sizeof(s[0]),cmp);

示例完整函数(已在 VC6.0上运行通过):

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4int s[10000],n,i; 5int cmp(const void *a,const void *b) 6{ 7 return(*(int *)b-*(int *)a); //实现的是降序排序 8} 9int main() 10{ 11// 输入想要输入的数的个数 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 scanf("%d",&s[i]); 15 qsort(s,n,sizeof(s[0]),cmp); 16 for(i=0;i<n;i++) 17 printf("%d ",s[i]); 18 return(0); 19}

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

char word[100];

1int cmp( const void *a , const void *b ) 2{ 3 4//注意,网上很多版本是 “ return *(char *)a - *(int *)b; ” 5//因为编辑者的不用心,盲目copy,以讹传讹,传的一直是错的 *(int *)b 6//应该是return *(char *)a - *(char *)b; 7 return *(char *)a - *(char *)b; 8} 9qsort(word,100,sizeof(word[0]),cmp); 10 11//附,可能 getchar(); 会派上用场

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

1double in[100]; 2int cmp( const void *a , const void *b ) 3{ 4return *(double *)a > *(double *)b ? 1 : -1; 5//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失,用一个判断返回值。 6} 7qsort(in,100,sizeof(in[0]),cmp); 8 9 //附:排序结果的输出,一般建议用 “ %g ” 格式 10 11/* 在这里多嘴一句,"%g"格式输出 虽然书上是说系统会自动选择 " %f " 格式 和 " %e " 格式 中长度较短的格式,并去掉无意义的0,但实际上系统如果选择了" %e ",系统会输出比 “ %e " 格式更省一位的格式输出。(此结论,来自VC6.0的实际操作)*/

四、对结构体一级排序

1struct In{ 2 double data; 3 int other; 4}s[100] 5 6//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 7 8int cmp( const void *a ,const void *b){ 9 return (*(In *)a).data > (*(In *)b).data ? 1 : -1; 10//注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。 11 12//或者你可以将这上面1条语句改成下面这3条语句 13 14//struct In *aa = (In *)a; 15//struct In *bb = (In *)b; 16//return aa->data > bb->data ? 1 : -1; 17} 18 19qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

1struct In{ 2 int x; //你可以比喻成:失败次数 3 int y; //你可以比喻成:成功次数 4}s[100]; 5 6//按照x从小到大排序,当x相等时按照y从大到小排序。 你可以想象成:失败是主要因素的一个问题,先比较 失败次数少,失败次数相同 再看 成功次数多。 7 8int cmp( const void *a , const void *b ){ 9 struct In *c = (In *)a; 10 struct In *d = (In *)b; 11 if(c->x != d->x) return c->x - d->x; 12 else return d->y - c->y; 13} 14 15qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

1struct In{ 2 int data; 3 char str[100]; 4}s[100]; 5//按照结构体中字符串str的字典顺序排序 6int cmp ( const void *a , const void *b ) 7{ 8 return strcmp( (*(In *)a)->str , (*(In *)b)->str ); 9} 10 11qsort(s,100,sizeof(s[0]),cmp); 12

注意!qsort 中的 cmp 得自己写 。

再说说 sort (常用于 C++ )

sort 使用时得注明:using namespace std; 或直接打 std::sort() 还得加上 #include <algorithm> 头文件

例:

1#include<iostream> 2#include<algorithm> 3using namespace std; 4int main() 5 6{ 7 int a[20]; 8 for(int i=0;i<20;++i) 9 cin>>a[i]; 10 sort(a,a+20); //范围,很明显这里是a+20 注意,这是必要的,如果是a+19 11 for(i=0;i<20;i++) //最后一个值a[19]就不会参与排序。 12 cout<<a[i]<<endl; 13 return 0; 14}

std::sort是一个改进版的qsort. std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。

最后,我们来说说sort、qsort的区别:

sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数,只要注明 使用的库函数就可以使用,参数只有两个(如果是普通用法)头指针和尾指针;

默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数

1#include<iostream> 2#include<algorithm> 3using namespace std; 4int cmp(int a,int b) 5{ 6 if(a<b) 7 return 1; //升序排列,如果改为 a >b,则为降序,要注意sort()中cmp()的返值只有1和0,不像qsort中存在-1!!!! 8 else 9 return 0; 10} 11 12int main(){ 13 int i; 14 int a[20]; 15 for(int i=0;i<5;++i) 16 cin>>a[i]; 17 sort(a,a+5,cmp); //范围,很明显这里是a+5 注意,这是必要的,如果是a+4最后一个值a[4]就不会参与排序。 18 for(i=0;i<5;i++) 19 cout<<a[i]<<endl; 20 system("pause"); 21 return 0; 22}

对二维数组的排序:

1#include <iostream> 2#include <algorithm> 3#include <ctime> 4using namespace std; 5bool cmp(int *p,int *q) 6{ 7 if(p[0]==q[0]) 8 { 9 if(p[1]==q[1]) 10 { 11 return p[2]<q[2]; 12 } 13 else return p[1]<q[1]; 14 } 15 else return p[0]<q[0]; 16} 17int main() 18{ 19 srand(time(0)); 20 int i; 21 int **a=new int*[1000]; 22 for(i=0;i<1000;++i) 23 { 24 a[i]=new int[3]; 25 a[i][0]=rand()%1000; 26 a[i][1]=rand()%1000; 27 a[i][2]=rand()%1000; 28 //printf("%d\t%d\t%d\n",a[i][0],a[i][1],a[i][2]); 29 } 30 sort(a,a+1000,cmp); 31 /*cout<<"After sort"<<endl; 32 for(i=0;i<1000;++i) 33 { 34 printf("%d\t%d\t%d\n",a[i][0],a[i][1],a[i][2]); 35 }*/ 36 return 0; 37}

所以呢,有事没事,咱们也可以看看 C++

C语言标准库函数qsort那点小事

qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。

##函数原型:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( 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的例子就是说明这个问题的)。

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个元素,只需要在第一个和第二个参数上进行一些修改:

void qsort(&s[i],m,sizeof(s[i]),cmp);

##标程,举例说明

###No.1、手工实现QuickSort:

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

1#include<stdio.h> 2#include<stdlib.h> 3void QuickSort(int *A,int left,int right) 4{ 5 if(left>=right) return; 6 int x=A[(left+right)>>1],low=left,high=right; 7 while(low<high) 8 { 9 while(A[low]<x) 10 low++; 11 while(A[high]>x) 12 high--; 13 if(low<=high) 14 { 15 int Temp=A[low]; 16 A[low]=A[high]; 17 A[high]=Temp; 18 low++; 19 high--; 20 } 21 } 22 QuickSort(A,left,high); 23 QuickSort(A,low,right); 24} 25int main() 26{ 27 int length,i,r[10000]; 28 scanf("%d",&length); 29 for(i=1;i<=length;i++) 30 scanf("%d",&r[i]); 31 QuickSort(r,1,length); 32 for(i=1;i<=length;i++) 33 printf(" %d",r[i]); 34 printf("\n"); 35 system("pause"); 36 return 0; 37}

或者:

1#include<stdio.h> 2#include<stdlib.h> 3int QKPass(int r[],int left,int right) 4{ 5 int low,high,x; 6 x=r[left];//选择基准记录 7 low=left; 8 high=right; 9 while(low<high) 10 { 11 while(low<high&&r[high]>=x)//从右到左找到小于x的记录 12 high--; 13 if(low<high) 14 { 15 r[low]=r[high];//找到后进行替换 16 low++; 17 } 18 while(low<high&&r[low]<x) 19 { 20 low++; 21 } 22 if(low<high) 23 { 24 r[high]=r[low]; 25 high--; 26 } 27 r[low]=x;//将基准记录保存在low=high的位置 28 return low;//返回基准记录的位置 29 } 30} 31int QKSort(int r[],int low,int high) 32{ 33 int pos; 34 if(low<high) 35 { 36 pos=QKPass(r,low,high); 37 QKSort(r,low,pos-1); 38 QKSort(r,pos+1,high); 39 } 40} 41int main() 42{ 43 int length,i,r[10000]; 44 scanf("%d",&length); 45 for(i=1;i<=length;i++) 46 scanf("%d",&r[i]); 47 QKSort(r,1,length); 48 for(i=1;i<=length;i++) 49 printf("%-3d",r[i]); 50 printf("\n"); 51 system("pause"); 52 return 0; 53}

###No.2、最常见的,对int数组排序 :

1#include<stdio.h> 2#include<stdlib.h> 3int s[10000],n,i; 4int cmp(const void *a, const void *b) 5{ 6 return(*(int *)a-*(int *)b); //升序 7 //return(*(int *)b-*(int *)a); //降序 8} 9int main() 10{ 11 scanf("%d",&n); 12 for(i=0;i<n;i++) 13 scanf("%d",&s[i]); 14 qsort(s,n,sizeof(s[0]),cmp); 15 for(i=0;i<n;i++) 16 printf("%d ",s[i]); 17 printf("\n"); 18 system("pause"); 19 return 0; 20}

###No.3、对double型数组排序,原理同int:

这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1

1#include<stdio.h> 2#include<stdlib.h> 3double s[1000]; 4int i,n; 5int cmp(const void * a, const void * b) 6{ 7 return((*(double*)a-*(double*)b>0)?1:-1); //升序 8} 9 10int main() 11{ 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 scanf("%lf",&s[i]); 15 qsort(s,n,sizeof(s[0]),cmp); 16 for(i=0;i<n;i++) 17 printf("%.2lf ",s[i]); 18 printf("\n"); 19 system("pause"); 20 return(0); 21}

###No.4、对一个字符数组排序.原理同int:

1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4char s[10000],i,n; 5int cmp(const void *a,const void *b) 6{ 7 return(*(char *)a-*(char *)b); //升序 8} 9int main() 10{ 11 scanf("%s",s); 12 n=strlen(s); 13 qsort(s,n,sizeof(s[0]),cmp); 14 printf("%s",s); 15 printf("\n"); 16 system("pause"); 17 return 0; 18}

###No.5、对结构体排序(一级排序):

很多时候我们都会对结构体排序,比如2010年校赛的那个根据几个参数排序,一般这个时候都在cmp函数里面先强制转换了类型,不要在return里面转换,我也说不清为什么,但是这样程序会更清晰,并且绝对是没错的。 这里同样请注意double返回0的问题:

1#include<stdio.h> 2#include<stdlib.h> 3struct node { 4 double data; 5 int no; 6} s[100]; 7int i,n; 8int cmp(const void *a,const void *b) { 9 struct node *aa=(node *)a; 10 struct node *bb=(node *)b; 11 return(((aa->data)>(bb->data))?1:-1);//升序 12} 13int main() 14{ 15 scanf("%d",&n); 16 for(i=0;i<n;i++) 17 { 18 s[i].no=i+1; 19 scanf("%lf",&s[i].data); 20 } 21 qsort(s,n,sizeof(s[0]),cmp); 22 23 for(i=0;i<n;i++) 24 printf("%d %lf\n",s[i].no,s[i].data); 25 system("pause"); 26 return 0; 27}

###No.6、对结构体排序(二级排序)。

加入no来使其稳定(即data值相等的情况下按原来的顺序排):

1#include<stdio.h> 2#include<stdlib.h> 3struct node 4{ 5 double data; 6 int no; 7} s[100]; 8 9int i,n; 10int cmp(const void *a,const void *b) 11{ 12 struct node *aa=(node *)a; 13 struct node *bb=(node *)b; 14 if(aa->data!=bb->data) 15 return(((aa->data)>(bb->data))?1:-1); 16 else 17 return((aa->no)-(bb->no)); 18} 19int main() 20{ 21 scanf("%d",&n); 22 for(i=0;i<n;i++) 23 { 24 s[i].no=i+1; 25 scanf("%lf",&s[i].data); 26 } 27 qsort(s,n,sizeof(s[0]),cmp); 28 for(i=0;i<n;i++) 29 printf("%d %lf\n",s[i].no,s[i].data); 30 printf("\n"); 31 system("pause"); 32 return 0; 33}

如果有字符串的话,就这样写:

1int cmp(const void *a,const void *b) 2{ 3 struct node *aa=(node *)a; 4 struct node *bb=(node *)b; 5 if(aa->data!=bb->data) 6 return(((aa->data)>(bb->data))?1:-1); 7 else 8 return((aa->no)-(bb->no)); 9 else 10 return strcmp(aa.str,bb.str); 11 //return strcmp(aa->str,bb->str); 12 //按照结构体中字符串str的字典顺序排序 13}

###No.7、对字符串数组的排序(char s[][]型):

1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4char s[100][100]; 5int i,n; 6int cmp(const void *a,const void *b) 7{ 8 return(strcmp((char*)a,(char*)b)); 9} 10int main() 11{ 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 scanf("%s",s[i]); 15 qsort(s,n,sizeof(s[0]),cmp); 16 for(i=0;i<n;i++) 17 printf("%s\n",s[i]); 18 printf("\n"); 19 system("pause"); 20 return 0; 21}

###No.8、对字符串数组排序(char *s[]型):

1#include<stdio.h> 2#include<string.h> 3#include<stdlib.h> 4char *s[100]; 5int i,n; 6int cmp(const void *a,const void *b) 7{ 8 return(strcmp(*(char**)a,*(char**)b)); 9} 10int main() 11{ 12 scanf("%d",&n); 13 for(i=0;i<n;i++) 14 { 15 s[i]=(char*)malloc(sizeof(char*)); 16 scanf("%s",s[i]); 17 } 18 qsort(s,n,sizeof(s[0]),cmp); 19 for(i=0;i<n;i++) 20 printf("%s\n",s[i]); 21 printf("\n"); 22 system("pause"); 23 return 0; 24}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

python刷题-序列求和

问题描述求123...n的值。输入格式输入包括一个整数n。输出格式输出一行,包括一个整数,表示123...n的值。样例输入4样例输出10样例输入100说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低

PTA 7

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。输入格式:输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。输出格式:将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一

python刷题-杨辉三角形

问题描述杨辉三角形又称Pascal三角形,它的第i1行是(ab)i的展开式的系数。  它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。  下面给出了杨辉三角形的前4行:1111211331  给出n,输出它的前n行。输入格式输入包含一个数n。输出格式输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次

Spring Cloud(六)《基于github webhook动态刷新服务配置》

!(https://oscimg.oschina.net/oscnet/e4b593359aa1dfd890f72b82551627f5e6a.jpg)作者:付政委自诚明,谓之性;自明诚,谓之教微信公众号:bugstack虫洞栈沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前

2019考研数学汤家凤张宇李永乐复习资料

2019考研复习资料_张宇_1.2019张宇概率论与数理统计9讲.pdf(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fu16305971.pipipan.com%2Ffs%2F16305971299832870%25202019%25E5%25BC