算法第二章上机实验报告
Posted sisilovestudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第二章上机实验报告相关的知识,希望对你有一定的参考价值。
1. 实践题目:改写二分搜索算法
2. 问题描述:设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
3. 算法描述:在二分法算法的基础上,最后添加了一个left 和right 互换,因为跳出循环的条件是left>right,而我们要输出的是小于x的最大元素位置和大于x的最小元素位置。
代码:
int BIN(int a[], int key, int n) {
int left = 0;
int right = n - 1;
int i = 0;
int j = 0;
while (left <= right) {
int middle = (left + right) / 2;
if (key == a[middle])
{
i = j = middle;
cout << i <<" "<<j<<endl;
return middle;
}
if (key > a[middle])left = middle + 1;
else { right = middle - 1; }
}
i = right;
j = left;
cout << i<<" "<< j<<endl;
return -1;
}
4. 算法时间及空间复杂度分析:
时间复杂度:二分查找是将数组 array 从中间切成大致相等的两部分,取 array[n/2] 与key做比较,如果 x==a[n/2] ,则找到 key 。因为每次规模都小一半,最多找了 k 次,则 2^k = n, k = log n,时间复杂度为O(log n)。
空间复杂度:本题变量不会随着 n 而变化,空间复杂度为O(1)。
5.心得体会:通过改写二分法,原本以为已经掌握二分法的我还是卡了很久,最后通过与伙伴的讨论才知道left与right的值要交换,在编程过程,我们还是要多一份细心多一份变通。
以上是关于算法第二章上机实验报告的主要内容,如果未能解决你的问题,请参考以下文章