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

堆排序 320MS 二叉排序 540MS 字符数组必须开大 我开到260 了

Posted by chenjin1st at 2012-04-15 16:01:27 on Problem 1002
代码部分。
注释的是堆排序 没注释的二叉树
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int mid;
	int number;
	struct node *left;
	struct node *right;
}BSTree;
int flag;
int Tidy(char phone[]);
BSTree *BinFind(BSTree *btree,int key);
int CaretTree(BSTree *btree,int mid);
int BinSort(BSTree *btree);
int main(){
	BSTree *btree,*addres;
	char phone[250];
	int n,value,i;
	scanf("%d",&n);
	scanf("%s",phone);
	value = Tidy(phone);
	btree =( BSTree *)malloc(sizeof(BSTree));
	btree ->left=btree ->right=NULL;
	btree ->mid = value;
	btree ->number=1;
	flag = 1;
	for( i = 1 ; i < n;i++){
		scanf("%s",phone);
		value =Tidy(phone);
		addres = BinFind(btree,value);
		if ( addres ){
			addres ->number ++;
		}else{
			CaretTree(btree,value);
		}	
	}
	BinSort(btree);
	if( flag )
		printf("No duplicates.\n");
	return 0;
}
int Tidy(char phone[]){
	char ch;
	int j,i,k;
	k=i=0;
	while(phone[i]){
		   ch=phone[i];
		   if(ch>='0'&&ch<='9'){
				k=k*10+(ch-'0');
		   }else{
			   if(ch>='A'&&ch<='P'){
					j=(ch-'A')/3+2;	
					k=k*10+j;
				}else{
					if(ch>='R'&&ch<='Y'){
						j=(ch-'A'-1)/3+2;
						k=j+k*10;
					}
			    }
		   }
		   i++;
	}
	return k;
}
BSTree *BinFind(BSTree *btree,int key){
	if( ! btree || btree ->mid == key){
		return btree;
	}else{
		if( btree ->mid > key)
			return (BinFind(btree ->left,key));
		else
			return (BinFind(btree ->right,key));
	}
}
int CaretTree(BSTree *btree,int mid){
	BSTree *head,*parent,*node;
	node = (BSTree *)malloc(sizeof(BSTree));
	node ->left = node ->right = NULL;
	node ->mid = mid;
	node ->number = 1;
	head = btree;
	while( head ){
		parent =head;
		if( head ->mid > mid )
			head= head ->left;
		else
			head = head ->right;
	}
	if( parent ->mid > mid)
		parent ->left =node;
	else
		parent ->right =node;
	return 0;
}
int BinSort(BSTree *btree){
	if( btree){
		BinSort(btree->left);
		if( btree ->number > 1){
			printf("%03d-%04d %d\n",btree->mid/10000,btree->mid%10000,btree->number);
			flag = 0 ;
		}
		BinSort(btree ->right);
	}
	return 0;
}
/*
#include<stdlib.h>
#include<stdio.h>
int tidy_phonenumber(char telphone[],int *number); ///*字符串处理部分
int HeapAdjust(int mid[],int start,int n);        ///*构造堆排序的函数
int HeapSort(int mid[],int n);					///*堆排序函数
int main(){
	int n,i,j,k,flag=1,*mid;
	char phone[250];
	scanf("%d",&n);
	mid=(int *)malloc(n*sizeof(int));       ///*动态申请空间避免空间浪费
	for(i=0;i<n;i++){
		scanf("%s",phone);
		tidy_phonenumber(phone,&mid[i]);
	}
	HeapSort(mid,n);                      // /*排序部分
//	/*下面的对已经排序的好的数组进行扫描输出我们需要的
//	/*扫描部分自我感觉还可以优化
	for(i=0;i<n;){
		if(mid[i]==mid[i+1]){
			for(j=i,k=1;mid[j]==mid[j+1];){
				j++;
				k++;
			}
			printf("%03d-%04d %d\n",mid[i]/10000,mid[i]%10000,k);
			i+=k;
			flag=0;
		}else{
			i++;
		}
	}
	if(flag)	//如果没有相同的情况下输出。我想也不可能没有相同
		printf("No duplicates.\n");
	free(mid);///释放空间
	return 0;
}
int tidy_phonenumber(char telphone[],int *number){
	char ch;
	int j,i,k;
	k=i=0;
	while(telphone[i]){
		   ch=telphone[i];
		   if(ch>='0'&&ch<='9'){
				k=k*10+(ch-'0');
		   }else{
			   if(ch>='A'&&ch<='P'){
					j=(ch-'A')/3+2;	
					k=k*10+j;
				}else{
					if(ch>='R'&&ch<='Y'){
						j=(ch-'A'-1)/3+2;
						k=j+k*10;
					}
			    }
		   }
		   i++;
	}
	*number=k;
	return 0;
}
int HeapSort(int mid[],int n){
	int i,j,value;
	for(i=n/2-1;i>=0;i--){
		HeapAdjust(mid,i,n);
	}
	for(i=n-1;i>0;i--){
		value=mid[0];
		mid[0]=mid[i];
		mid[i]=value;
		HeapAdjust(mid,0,i);
	}
	return 0;
}
int HeapAdjust(int mid[],int start,int n){
	int i,j;
	while(2*start+1<n){
		j=2*start+1;
		if((j+1)<n){
			if(mid[j]<mid[j+1])
				j++;
		}
		if(mid[start]<mid[j]){
			i=mid[start];
			mid[start]=mid[j];
			mid[j]=i;
			start=j;
		}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