职工信息中选择排序,折半查找的综合应用
/*
Date: 07/03/19 19:27
Description: 选择排序、折半查找、函数的综合应用
*/
1 #include<stdio.h> 2 #include<string.h> 3 #define N 10 4 //函数声明部分 5 6 void input(int [],char name[][8]); 7 void output(int [],char name[][8]); 8 void sort(int [],char name[][8]); 9 void search(int n,int [],char name[][8]); 10 int main(void) 11 { 12 int num[N],number,flag=1,c; 13 char name[N][8]; 14 15 input(num,name);//调用输入函数 16 sort(num,name);//调用排序函数 17 output(num,name);//调用输出函数 18 while(flag==1) 19 { 20 printf("\ninput number to look for:"); 21 scanf("%d",&number); 22 search(number,num,name);//调用折半查找函数 23 printf("continue or not(Y/N)?"); 24 getchar();//吃掉scanf输入末尾的回车键 25 c=getchar(); 26 if(c=='N'||c=='n') 27 { 28 flag=0; 29 } 30 } 31 return 0; 32 } 33 void input(int num[],char name[][8])//输出信息函数 34 { 35 int i; 36 for(i=0;i<N;i++) 37 { 38 printf("%d: input NO.:",i+1); 39 scanf("%d",&num[i]); 40 printf("input name:"); 41 getchar();//吃掉scanf输入末尾的回车键 42 gets(name[i]); 43 } 44 } 45 void output(int num[],char name[][8])//输出信息函数 46 { 47 int i; 48 printf("\n result:\n"); 49 for(i=0;i<N;i++) 50 printf("\n%5d%10s",num[i],name[i]); 51 } 52 void sort(int num[],char name[][8])//选择排序 53 { 54 int i,j,min,temp1; 55 char temp2[8]; 56 57 for(int i=0;i<N;i++) 58 { 59 min=i; 60 for(j=i;j<N;j++) 61 if(num[min]>num[j]) 62 min=j; 63 temp1=num[i]; 64 strcpy(temp2,name[i]); 65 num[i]=num[min]; 66 strcpy(name[i],name[min]); 67 num[min]=temp1; 68 strcpy(name[min],temp2); 69 } 70 } 71 void search(int n,int num[],char name[][8])//折半查找 72 { 73 int top,bott,mid,local,sign; 74 top=0;bott=N-1;local=0;sign=1; 75 76 if((n<num[0])||(n>num[N-1])) 77 local=-1; 78 while((sign==1) && (top<=bott)) 79 { 80 mid=(top+bott)/2; 81 if(n==num[mid])//查找到 82 { 83 local=mid; 84 printf("NO. %d,his name is %s. \n",n,name[local]); 85 sign=-1; 86 } 87 else if(n<num[mid])//在前半部分 88 bott=mid-1; 89 else//在后半部分 90 top=mid+1; 91 } 92 if(sign==1||local==-1)//没找到 93 printf("%d not been found.\n",n); 94 }