码迷,mamicode.com
首页 > 编程语言 > 详细

算法第二章上机实验报告

时间:2018-10-21 20:36:03      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:题目   掌握   时间   while   代码   span   二分搜索   部分   搜索   

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的值要交换,在编程过程,我们还是要多一份细心多一份变通。
 

算法第二章上机实验报告

标签:题目   掌握   时间   while   代码   span   二分搜索   部分   搜索   

原文地址:https://www.cnblogs.com/sisilovestudy/p/9826536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!