数据结构——查找与排序

ex5_1:查找——基本题

假设有序序列的数据元素为:(3,10,13,17,40,43,50,70)
1)编写顺序查找函数
2)编写二分查找函数
3)在主程序中输入关键字(43和5),分别调用两种查找函数,输出结果。

ex5_2:Hash查找——扩展题

1)一个班有30位同学,安排装进一个有30个元素的数组,以姓名作为关键字进行哈希存储,具体方法如下:将姓名字符串中的每个字节按ASCII码(中文也支持 的哦)加起来,除以30,取得的余数作为元素存放位置(数组下标)。冲突解决采用线性探查法。
2)输入少于30个学生姓名,按Hash方式存入表中。
3)验证能够按Hash方式找到表中学生,不在表中将提示错误

ex5_3:排序——基本题

1)编写简单选择法函数
2)编写直接插入法函数
3)编写冒泡法排序函数
4)在主程序中输入一组数据元素,如513,87,512,61,908,170,897,275,653,462,分别调用三种排序函数,输出每趟排序结果。

ex5-4:排序——扩展题编写快速排序函数

#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct name{
	char a[30];
}name; 
int commonfind(int a[],int n){
	int i=0,pos,flag=0;	
	while(a[i]!=0){	
		if(a[i]==n){		
			pos=i+1;			
			flag=1;		
		}		
		i++;	
	}	
	if(flag==0)		
		return 0;	
	else	
		return pos;	
	}
int devidefind(int a[],int n,int size){
	if(size==1){	
		if(a[0]==n)			
			return 1;		
		else		
			return 0;	
	}else if(devidefind(a,n,size/2)!=0)		
		return devidefind(a,n,size/2);		
	else if(devidefind(&a[size/2],n,size-size/2)!=0)		
		return size/2+devidefind(&a[size/2],n,size-size/2);
}
int Hash(char * cp){
	int i,n;    
	int sum = 0;   
	n = strlen(cp);    
	for( i = 0 ; i < n; i++){       
	      sum += (int)*cp;            
	       cp ++;    
	}	
	return sum%10;
}
void Hashstore(name student[],int pos,char s[]){
	while(student[pos].a[0]!='\0'){	
		pos=pos++;		
		pos=pos%10;	
	}	
	strcpy(student[pos].a,s);
} 
int Hashfind(name student[],char s[]){
	int h,i=0;	
	h=Hash(s);	
	while(!strcmp(student[h].a,s)){	
		h=(h+1)%10;		
		i++;		
		if(i>10)		
			return 0;	
	}	
	return h;
}
void simplesort(int a[],int size){
	int i;	
	int j;	
	int t;	
	for(i=1;i<size;i++)	
		for(j=i;j>0;j--){		
			if(a[j]<a[j-1])	{			
				t=a[j];			
				a[j]=a[j-1];		
				a[j-1]=t;				
				continue;			
			}			
			if(a[j>=a[j-1]])				
				break;		
		}
}
void selectsort(int a[],int size){
	int i,min=a[0],minpos=0;	
	int num=0;	
	while(num<size){	
		min=a[num],minpos=num;		
		for(i=num;i<size;i++){		
			if(a[i]<min){			
				min=a[i];				
				minpos=i;		
			}		
		}		
		a[minpos]=a[num];		
		a[num]=min;		
		num++;				
	}
} 
void gulugulu(int a[],int size){
	int i,j,t;	
	for(i=0;i<size-1;i++)	
		for(j=0;j<size-1-i;j++)			
			if(a[j+1]<a[j])	{			
				t=a[j];				
				a[j]=a[j+1];
				a[j+1]=t;			
			}
} 
void quicklysort(int a[],int size){
	int i;	int nmin=0,nmax=0;
	int *anew;	
	anew=(int*)malloc(size*sizeof(int));	
	if(size==1||size==0)	
		return;		
	for(i=0;i<size;i++){		
		if(a[i]<a[0]){			
			*(anew+nmin)=a[i];
			nmin++;			
		}			
		if(a[i]>=a[0]&&i!=0){			
			*(anew+size-1-nmax)=a[i];				
			nmax++;			
		}		
	}		
	*(anew+nmin)=a[0];		
	for(i=0;i<size;i++)		
		a[i]=*(anew+i);				
	quicklysort(&a[0],nmin);			
	quicklysort(&a[nmin+1],nmax);
}
void main(){		
//111111111111111111111111111111111111111111111	
	name student[10];	
	char e[30];	
	int a[]={3,10,13,17,40,43,50,70,0};	
	int i;	
	int x;	
	printf("3,10,13,17,40,43,50,70,0\n");	
	scanf("%d",&x);	
	printf("直接搜索结果:%d\n",commonfind(a,x));	
	printf("二分查找搜索结果:%d\n",devidefind(a,x,8));	
//22222222222222222222222222222222222222222222	
	printf("输入十个名字\n");	
	for(i=0;i<10;i++)		
		student[i].a[0]='\0';	
	for(i=0;i<10;i++){	
		scanf("%s",e);		
		Hashstore(student,Hash(e),e);
	} 	
	for(i=0;i<10;i++)	
		printf("%s ",student[i].a);	
	printf("\n");	
	printf("输入需查找的名字\n");	
	scanf("%s",e);	
	printf("%d\n",Hashfind(student,e));	
//33333333333333333333333333333333333	
	int unsort1[100];	
	int unsort2[100];	
	int unsort3[100];	
	int unsort4[100];	
	int sizes=0;	
	int elem=1;	
	printf("输入n个整数,以0结束\n");	
	while(elem!=0){	
		scanf("%d",&elem);		
		if(elem!=0){		
			unsort1[sizes]=elem;			
			unsort2[sizes]=elem;			
			unsort3[sizes]=elem;			
			unsort4[sizes]=elem;			
			sizes++;		
		}	
	}	
	for(i=0;i<sizes;i++)		
		printf("%d ",unsort1[i]);	
	printf("\n"); 	
	printf("插入排序结果:");
	simplesort(unsort1,sizes);	
	for(i=0;i<sizes;i++)	
		printf("%d ",unsort1[i]);	
	printf("\n");
//44444444444444444444444444444444444444444444	
	printf("选择排序结果:");	
	selectsort(unsort2,sizes);	
	for(i=0;i<sizes;i++)	
		printf("%d ",unsort2[i]);	
	printf("\n");
//55555555555555555555555555555555555555555555	
	printf("冒泡排序结果:");	
	gulugulu(unsort3,sizes);	
	for(i=0;i<sizes;i++)
		printf("%d ",unsort3[i]);	
	printf("\n"); 
//666666666666666666666666666666666666666666	
	printf("快速排序结果:");
	quicklysort(unsort4,sizes);	
	for(i=0;i<sizes;i++)	
		printf("%d ",unsort4[i]);	
	printf("\n");}

ex5-4:归并排序——扩展题(选作)

归并排序由于为选做,无C语言版本,此处只有python版

def emerge(a,b):
    c=[]    
    m=0    
    n=0    
    if type(a)==int:   
         if a>b:       
              c=[b,a]        
         else:       
              c=[a,b]    
   else:   
         lmax=len(a)+len(b)        
         a.append(99999999)        
         b.append(99999999)        
         for i in range(0,lmax):      
               if a[m]<=b[n]:                
	           c.append(a[m])                
	           m=m+1            
               else:            
                   c.append(b[n])       
                   n=n+1    
    return c
def pandidi(a): 
    if len(a)==1:    
      	out=a[0]   
    else:    
       	l=len(a)/2        
      	l=int(l)        
       	a1=a[0:l]        
      	a2=a[l:-1]        
       	a2.append(a[-1])        
       	out=emerge(pandidi(a1),pandidi(a2))    
   return out
x=input('输入')
m=x.split(sep=' ')
m2=[]
for i in m:
	m2.append(eval(i))
k=pandidi(m2)
print(k)
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值