标签:include cout 体会 代码 二分 div 输出 space ==
1.实践题目
题目来源:《计算机算法设计与分析》,王晓东
设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
输入有两行:
第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。
输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值
在这里给出一组输入。例如:
6 5
2 4 6 8 10 12
在这里给出相应的输出。例如:
1 2
2.问题描述
问题是让我们改写二分搜索法,在一个有序的序列中查找一个已知数,当这个数在数组中时,返回小于这个数的最大元素的位置和大于这个数的最小元素的位置。当这个数小于这个序列的第一个数,返回-1和0.当这个数大于序列最后一个数
返回数组中最后一个元素的位置和值。
3.算法描述
先设置了一个全局变量(用来辅助输出)
函数BinarySearch:
设置两个变量left和right
判断要找的那个数是否在这个数组范围内,
如果小于第一个数 返回-1
如果大于最后一个数 返回 n(这个n是序列的个数,后来也是用来辅助输出的)
如果在数组内:
设置一个循环(界限为left<=right)
设一个变量 m = (left+right)/2
如果找到要找的数,将num=m,返回m
如果没找到 返回right(因为推出循环,left肯定是大于right,意味着当left=right时,这个数大于在这个位置的数,所以返回right(这个位置的数是小于这个数的最大数))
算法完整代码如下:
第1次折半:还剩n/2个元素
第2次折半:还剩n/4个元素
第3次折半:还剩n/8个元素
……
第k次折半:还剩n/2^k个元素
最坏的情况下,最后还剩1个元素,令n/2^k = 1。得k=logn。
时间复杂度O(logn)
由于辅助空间是常数级别的所以:
标签:include cout 体会 代码 二分 div 输出 space ==
原文地址:https://www.cnblogs.com/UTUT/p/9787442.html