Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

C写的。堆排序加二分 700MS过。 代码写的不好请凑合看

Posted by chenjin1st at 2012-04-09 19:45:24 on Problem 2503
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
	char *orig;			//原词
	char *tran;			//译词
}Word;
int adjustSort(Word word[],int n,int start);
int HeapSort(Word word[],int n);
int QuickSort(Word word[],int left,int right);
int DivSon( Word word[],int left,int right);
int BinFind(Word word[],int n,char key[]);
int main(){
	Word *word;
	char init[30],*ch;
	int addres,i,n;
	word = ( Word * ) malloc( 100000 *sizeof( Word ));
	n = 0;
	while(gets(init) && init[0]!='\0'){
		word[n].orig=(char *)malloc( 15 *sizeof(char));
		word[n].tran=(char *)malloc( 15 *sizeof(char));
		ch=strstr(init," ");
		addres = ch - init;
		strcpy(word[n].orig,&init[addres+1]);
		init[addres]='\0';
		strcpy(word[n++].tran,init);
//		sscanf(init,"%s%s",&tra,&org);
//		strcpy(word[n].orig,org);
//		strcpy(word[n++].tran,tra);
	}
	word = (Word *)realloc(word,n*sizeof(Word));
	HeapSort(word,n);
//	QuickSort(word,0,n-1);
//	for( i = 0 ; i < n ; i++)
//		printf("%s\t\t%s\n",word[i].orig,word[i].tran);
	while(scanf("%s",init)!=EOF){
		addres=BinFind(word,n,init);
		if( addres == -1)
			printf("eh\n");
		else
			printf("%s\n",word[addres].tran);
	}

	return 0;
}
int BinFind(Word word[],int n,char key[]){
	int mid,left,right,j;
	left = 0 ;
	right = n-1;
	while ( left <= right){
		mid = ( left +right )/2;
		j = strcmp(word[mid].orig,key);
		if( 0 == j){
			return mid;
		}else{
			if( 1== j)
				right = mid - 1;
			else
				left  = mid + 1;
		}	
	}
	return  -1;
}
int HeapSort(Word word[],int n){
	char *tmp;
	int i;
	for( i = n/2 -1;i >=0 ;i--)
		adjustSort(word,n,i);
	for( i = n-1; i>0;i--){

		tmp = word[0].orig;
		word[0].orig=word[i].orig;
		word[i].orig=tmp;

		tmp = word[0].tran;
		word[0].tran=word[i].tran;
		word[i].tran=tmp;

		adjustSort(word,i,0);
	}
	return 0;
}
int adjustSort(Word word[],int n,int start){
	int i ;
	char *tmp;
	while( 2 * start +1 < n){
		i =2 * start +1;
		if( (i + 1) < n ){
			if( strcmp(word[i].orig,word[i+1].orig) == -1){
				i++;
			}
		}
		if( strcmp( word[ i ].orig,word[start].orig) == 1){
			tmp = word[ i ].orig;
			word[i].orig = word[start].orig;
			word[start].orig= tmp;

			tmp = word[i].tran;
			word[i].tran=word[start].tran;
			word[start].tran=tmp;
			start = i;
		}else{
			break;
		}
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator