折半查找法

来源:互联网 发布:淘宝上建店铺 编辑:程序博客网 时间:2024/06/05 08:57

原题目

8.15 写几个函数(c程序设计第三版谭浩强)

① 输入10个职工的姓名和职工号;

② 按职工号由小到大顺序排序,姓名顺序也随之调整;

③ 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。


由于当时员工编号不是线性的数值,所以用折半查找法无法确认parr[i].name中,i的位置,没有按照要求,采用的是逐步i++。

  1. #include <stdio.h>#include <malloc.h>#include <stdlib.h>struct staff_inf{char name[20];int number;};struct staff_inf * input_inf(int n){struct staff_inf * parr = (struct staff_inf *)malloc(sizeof(struct staff_inf) * n);for(n;n>0;n--){printf("请输入员工姓名\n");scanf("%s", parr[n-1].name);printf("请输入员工编号\n");scanf("%d", &parr[n-1].number);}system("cls");//清屏 return parr;}void sort_inf(struct staff_inf * parr, int n){int i;int j;struct staff_inf  p;for(j=n-1;j>0;j--){for(i=0;i<j;i++){if(parr[i].number > parr[i+1].number)//交换位置,小值放前面 {p = parr[i];parr[i] = parr[i+1];parr[i+1] = p; }}}for(i=0;i<n;i++)printf("%s\t%d\n", parr[i].name, parr[i].number);return;}void search(struct staff_inf * parr, int n)//由于员工编号不是连续顺序排列值,所以未用折半查找法 {int search_number;int i;int j;printf("输入您要查找的员工编号\n");scanf("%d", &search_number);for(i=0;i<n;i++){if(search_number == parr[i].number){printf("%s\n", parr[i].name);j = 1; break;}elsej = 0;}if(j = 0)printf("没有找到结果\n");return;}int main(void){struct staff_inf * parr = input_inf(3);sort_inf(parr,3); search(parr,3);free(parr);return 0;}

    今天打算探索如何才能在非线性的数组中使用折半查找法确认数值的位置,于是将此题目重做。已知arr[10] = {1,3,7,13,33,55,61,997,10001,111111},输入一个数值,查找该数字在arr[10]中的位置的。
  2. #include <stdio.h>int main(void){int arr[10] = {1,3,7,13,33,55,61,500,997,1000};int number;printf("输入一个值,查找该数字的位置\n");scanf("%d", &number);int max = 9;int min = 0;int mid = 4;int j = 0; while(min != mid){if(arr[9] == number){printf("第10个数\n");j = 1;break;} else if(arr[0] == number){printf("第1个数\n");j = 1;break;} else if(number > arr[mid])min = mid;else if(number < arr[mid])max = mid;else{printf("第%d个数\n", mid+1);j = 1;break;} mid = (max + min)/2;} if(0 == j)printf("无此数\n");return 0;} 

    将解决方案2放入题目中
  3. #include <stdio.h>#include <malloc.h>#include <stdlib.h>struct staff_inf{char name[20];int number;};struct staff_inf * input_inf(int n){struct staff_inf * parr = (struct staff_inf *)malloc(sizeof(struct staff_inf) * n);for(n;n>0;n--){printf("请输入员工姓名\n");scanf("%s", parr[n-1].name);printf("请输入员工编号\n");scanf("%d", &parr[n-1].number);}system("cls");//清屏 return parr;}void sort_inf(struct staff_inf * parr, int n){int i;int j;struct staff_inf  p;for(j=n-1;j>0;j--){for(i=0;i<j;i++){if(parr[i].number > parr[i+1].number)//交换位置,小值放前面 {p = parr[i];parr[i] = parr[i+1];parr[i+1] = p; }}}for(i=0;i<n;i++)printf("%s\t%d\n", parr[i].name, parr[i].number);return;}void search(struct staff_inf * parr, int n)//由于员工编号不是连续顺序排列值,所以未用折半查找法 {int search_number;int i;int j;printf("输入您要查找的员工编号\n");scanf("%d", &search_number);for(i=0;i<n;i++){if(search_number == parr[i].number){printf("%s\n", parr[i].name);j = 1; break;}elsej = 0;}if(j = 0)printf("没有找到结果\n");return;}void search2(struct staff_inf * parr, int n)//折半查找 {int number;printf("输入您要查找的员工编号\n");scanf("%d", &number);int max = n-1;int min = 0;int mid = (n - 1)/2;int j = 0; while(min != mid){if(parr[n-1].number == number){printf("%s\n", parr[n-1].name);j = 1;break;} else if(parr[0].number == number){printf("%s\n", parr[0].name);j = 1;break;} else if(number > parr[mid].number)min = mid;else if(number < parr[mid].number)max = mid;else{printf("%s\n", parr[mid].name);j = 1;break;} mid = (max + min)/2;} if(0 == j)printf("没有找到结果\n");return;} int main(void){int nop;printf("请输入员工人数\n");scanf("%d", &nop); struct staff_inf * parr = input_inf(nop);sort_inf(parr,nop); search2(parr,nop);free(parr);return 0;}

    完美解决问题。



0 0