实验名称(查找) |
一、实验目的和要求 通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。 |
二、实验内容和原理 选做第一题、第二题 输入: 90 输出: 非递归查找90在第10个位置 递归查找90在第10个位置 输入: 2 输出: 非递归查找失败 递归查找失败 存储结构: 有序表采用顺序方式存储 算法思想: 首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上步骤,直到找到满足条件的结果为止,若找不到,则返回失败。 三、主要仪器设备 惠普笔记本,win10环境,皆在cpp文件运行,请同样以cpp形式打开 四、操作方法与实验步骤 |
#include<stdio.h>
#include<windows.h>
/*
1.首先给定一个有序表
2.进行输入待查找的数据
3.进行非递归查找,NoRecursionBinarysearch()
4.进行递归查找 RecursionBinarysearch()
*/
int NoRecursionBinarysearch(int *a, const int x, const int n);//折半查找非递归方式
int RecursionBinarysearch(int *a, const int x, const int left, const int right);//折半查找递归方式
int main(){
int z[] = { 12,23,28,35,37,39,50,60,78,90 };//给定的线性表
int answer, num;
printf("请输入要查找的数据:");
scanf("%d",&num);
if ((answer = NoRecursionBinarysearch(z, num, 10)) < 0) {
printf("非递归查找失败\n");
} else {
printf("非递归查找%d在第%d个位置\n",num,answer+1);
}
if((answer=RecursionBinarysearch(z,num,0,9)) < 0) {
printf("递归查找失败\n");
} else {
printf("递归查找%d在第%d个位置\n",num,answer+1);
}
system("pause");
return 0;
}
int NoRecursionBinarysearch(int *a, const int x, const int n){//使用非递归的方式
int left, right, middle;
left = 0; right = n - 1;
while (left <= right){
middle = (left + right) / 2;
if (a[middle] == x) return middle;
else if (a[middle] < x) left = middle + 1;
else if (a[middle] > x) right = middle - 1;
}
return -1;
}
int RecursionBinarysearch(int *a, const int x, const int left, const int right){//使用递归的方式
if (left <= right) {
int middle = (left + right) / 2;
if (x < a[middle]) return RecursionBinarysearch(a, x, left, middle - 1);
else if (x > a[middle]) return RecursionBinarysearch(a, x, middle + 1, right);
else return middle;
}
return -1;
}
五、实验数据记录和处理
六、实验结果与分析 折半查找法优缺点 问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。 优点: 比较次数少,查找速度快,平均性能好。 缺点: 是要求待查表为有序表,且插入删除困难,因此折半查找方法适用于不经常变动而查找频繁的有序列表。 二分查找递归: 时间复杂度:O(log2n) 空间复杂度:O(log2n) 也是递归的最大深度 二分查找非递归: 时间复杂度:O(log2n) 空间复杂度:O(1) 仅仅用几个单变量就够了 |
七、讨论、心得 二分查找会生成一棵二叉查找树,使用二分查找前提是线性表有序,所以如果有一个无序得线性表需要用二分查找,那么首先需要对其进行排序。 在实验分析可看出,二分查找递归与非递归时间复杂度相同但空间复杂度,非递归算法只为O(1),所以优先使用非递归算法。 |