第一个题比较小,wikioi的1076排序题,先说小题,展示一下qsort的基本用法。
#include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; int a[100000]; int cmp_int(const void* _a,const void* _b) { int* a=(int*)_a; int* b=(int*)_b; return *a-*b;//从小到大是a-b } int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } qsort(a,n,sizeof(int),cmp_int); // sizeof (每个元素的类型) for(int i=0;i<n;i++) { cout<<a[i]<<" "; } }首先最关注的一点就是qsort的四个参数。
1 待排序数组首地址 //直接用数组名即可
2 数组中待排序元素数量// 比如这里的n 不要太大否则后面的参与进来会出现问题
3 各元素的占用空间大小// sizeof函数来获得,比如int 就用 sizeof(int) 下面还会看到例子
4 指向函数的指针,用于确定排序的顺序 //函数名就是指向函数的指针,此函数的特点是
参数有两个都是 const void *_a,const void *_b
在内部要完成提供给qsort的比较方法。比如返回int 且 返回的是二者的差值,*a-*b,与参数顺序相同则是由大到小,反之亦然
然后写个例题比较深入的利用此函数。
字典:
样例输入
tarp given score refund only trap work earn course pepper part
******
resco nfudre aptr sett coures lony
样例输出
score
:(
part trap tarp
:(
:(
only
代码 基本没有自己的创新。
#include <stdio.h> #include <string.h> #include <stdlib.h> char word[2000][10],sorted[2000][10]; //虽然是6个字母 但是必须给7个空间 除了字母以外还需要保存其他的东西 int cmp_char(const void* _a,const void* _b) { char* a=(char*)_a; char* b=(char*)_b; return *a-*b; } int cmp_string(const void* _a,const void* _b) { char* a=(char*)_a; char* b=(char*)_b; return strcmp(a,b);//a b 是指针 } int main() { freopen("in13.txt","r",stdin); freopen("out13.txt","w",stdout); int i=0; for(;;) { scanf("%s",word[i]); if(word[i][0]=='*') break; i++; } //i是个数 //为字典中的单词排序 qsort(word,i,sizeof(word[0]),cmp_char); //四个参数中最奇葩的是最后一个,,,函数名 for(int j=0;j<i;j++) { //sorted[j]=word[j]; 二级数组不是一等市民 strcpy(sorted[j],word[j]);//目的数组在前 qsort(sorted[j],strlen(sorted[j]),sizeof(char),cmp_char); } char tem[10]; while(scanf("%s",tem)==1) { qsort(tem,strlen(tem),sizeof(char),cmp_char); int ok =0; for(int k=0;k<i;k++) { if(cmp_string(sorted[k],tem)==0) { printf("%s ",word[k]); ok=1;} } if(!ok) printf(":("); printf(" "); } }
此解法有一个以前也用过的思维方式,就是先排序的预处理。
因为已经对所有的word进行了sorted处理,所以导致找到重排后相同的单词直接输出即可。
但是此重排,要求两个数组都重排 否则还要考虑下标对应的麻烦。。
此处也可看岛qsort对字典序的处理
需要一个函数strcmp
大概就是这些了,最近一直没怎么写题,接下来应该是鞋cantor数表和蛇形排布复习了,蛇形排布我还是很喜欢的,可以好好地总结一下。