首页 > 技术文章 > 职工信息中选择排序,折半查找的综合应用

sinlearn 2019-03-07 20:35 原文

/* 
 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 }

 

推荐阅读