实践题目:改写二分搜索算法

问题描述:设a[0:n-1]是已排好序的数组,请改写二分搜索法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

算法描述:

如问题描述,如果输入的x存在于数组中,则i、j返回的是x在数组中的位置,否则返回小于x的最大数和大于x的最小数的位置。另外:如果输入的x小于或大于数组的所有数,则返回n和n-1;(n为数组中的整数个数)

所以有:

int Compare(int a[], int k, int n)
{
    int left = 0;
    int right = n - 1;
    int i = 0;
    int j = 0;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (k == a[middle])
        {
            i = j = middle;
            cout << i <<" "<<j<<endl;
            return middle;
        }
        if (k > a[middle])
        left = middle + 1;
        else
        right = middle - 1;
    }
     i = right;
     j = left;
    cout << i<<" "<< j<<endl;
    return -1;
}

然后i、j就可以输出了。

算法时间及空间复杂度分析:

while语句,left+right/2,问题规模为N,log2 N

所以时间复杂度为O(log2 N)

算法中只用到了middle之类的临时储存单元,所以空间复杂度应该是O(1)

心得体会(对本次实践收获及疑惑进行总结):

重新温习了二分查找法,并对其运用的方法又深入了解了一分。主要的收获是在做作业的时候又重新温习了一下算法时间复杂度的计算。