第一个题比较小,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("\n");
}
}
此解法有一个以前也用过的思维方式,就是先排序的预处理。
因为已经对所有的word进行了sorted处理,所以导致找到重排后相同的单词直接输出即可。
但是此重排,要求两个数组都重排 否则还要考虑下标对应的麻烦。。
此处也可看岛qsort对字典序的处理
需要一个函数strcmp
大概就是这些了,最近一直没怎么写题,接下来应该是鞋cantor数表和蛇形排布复习了,蛇形排布我还是很喜欢的,可以好好地总结一下。