您的位置:首页 > 其它

【算法学习笔记】05.qsort的初步应用

2014-07-29 19:28 183 查看
第一个题比较小,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数表和蛇形排布复习了,蛇形排布我还是很喜欢的,可以好好地总结一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: