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)