二分查找:
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
应用场景: 首先,二分查找依赖的是顺序表结构,简单点说就是数组。 其次,二分查找针对的是有序数据。 再次,数据量太小不适合二分查找。 最后,数据量太大也不适合二分查找。(二分查找的底层需要依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。)
function bSearch(nums, value) {
let low = 0;
let high = nums.length - 1;
while (low <= high){
let mid = low + ((high - low) >> 1);
if (nums[mid] < value){
low = mid + 1;
} else if (nums[mid] > value){
high = mid - 1;
} else {
return mid;
}
}
return - 1;
}
python:
def binary_search(arr, target):
n = len(arr)
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
t = [3,12,33,40,70,90]
a = binary_search(t, 40)
print(a)
查找第一个等于给定值的元素
function bSearch(nums, value) {
let low = 0;
let high = nums.length - 1;
while (low <= high){
let mid = low + ((high - low) >> 1);
if (nums[mid] < value){
low = mid + 1;
} else if (nums[mid] > value){
high = mid - 1;
} else {
if (mid == 0 || nums[mid - 1] !== value){
return mid
} else {
high = mid - 1;
}
}
}
return - 1;
}
python:
def binary_first_search(arr, target):
n = len(arr)
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if arr[mid] == target:
if mid > 0 and arr[mid-1] == target:
end = mid
else:
return mid
elif arr[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
t = [3,12,40,40, 40,70,90]
a = binary_first_search(t, 40)
print(a)
查找最后一个等于给定值的元素
function bSearch(nums, value) {
let low = 0;
let high = nums.length - 1;
while (low <= high){
let mid = low + ((high - low) >> 1);
if (nums[mid] < value){
low = mid + 1;
} else if (nums[mid] > value){
high = mid - 1;
} else {
if (mid == nums.length - 1 || nums[mid + 1] !== value){
return mid
} else {
low = mid + 1;
}
}
}
return - 1;
}
python:
def binary_last_search(arr, target):
n = len(arr)
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if arr[mid] == target:
if mid < n-1 and arr[mid+1] == target:
start = mid+1
else:
return mid
elif arr[mid] < target:
start = mid + 1
else:
end = mid - 1
return -1
t = [3,12,40,40, 40,70,90]
a = binary_last_search(t, 40)
print(a)
查找第一个大于等于给定值的元素
function bSearch(nums, value) {
let low = 0;
let high = nums.length - 1;
while (low <= high){
let mid = low + ((high - low) >> 1);
if (nums[mid] >= value){
if (mid == 0 || nums[mid - 1] < value){
return mid;
}
high = mid - 1;
} else {
low = mid + 1;
}
}
return - 1;
}
python:
def binary_fist_big_search(arr, target):
n = len(arr)
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if arr[mid] <= target:
start = mid + 1
else:
if mid > 0 and arr[mid-1] > target:
end = mid - 1
else:
return mid
return -1
t = [3,12,40,40, 40,70,90]
a = binary_fist_big_search(t, 40)
print(a)
查找最后一个大于等于给定值的元素
function bSearch(nums, value) {
let low = 0;
let high = nums.length - 1;
while (low <= high){
let mid = low + ((high - low) >> 1);
if (nums[mid] > value){
high = mid - 1;
} else {
if (mid == nums.length || nums[mid + 1] > value){
return mid;
}
low = mid + 1;
}
}
return - 1;
}
python:
def binary_last_big_search(arr, target):
n = len(arr)
start = 0
end = n - 1
while start <= end:
mid = (start + end) // 2
if arr[mid] <= target:
start = mid + 1
else:
if mid < n-1 and arr[mid+1] > target:
start = mid + 1
else:
return mid
return -1
t = [3,12,40,40, 40,70,90]
a = binary_last_big_search(t, 40)
print(a)