二分查找法仅针对有序数组,时间复杂度为O(log N):
//要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
public class 练习题1_1
{
public static int BinarySearch(int[] arr,int key)
{
int low = 0;
int high = arr.length -1;
int mid = 0;
if(key < arr[low] || key > arr[high] || low > high)
{
return -1;
}
while(low <= high)
{
mid =low + (high - low)/2;
if(arr[mid] > key)
{
high = mid-1;
}
else if(arr[mid] < key)
{
low = mid + 1;
}
else
{
return mid;//return是直接结束了方法
}
}
return -1;//直到最后还是没找到,就是没有return过,则返回-1
}
public static void main(String[] args)
{
int[] arr = {1,5,6,7,9};
int key = 7;//查找对象
int position = BinarySearch(arr,key);
int p = position+1;
if(position == -1)
{
System.out.println("要查找的数" + key +"没有找到!");
}
else
{
System.out.println("要查找的数:" + key +"在第:" + p + "个");
}
}
}
对于线性查找,即简单的遍历,既可以用于有序数组,也可以用于无序数组,时间复杂度为O(N)
有序数组的插入:需要比较,移动数据,找到合适的位置插入数据,时间复杂度为O(N)
【案例】在排序数组中查找元素第一个和最后一个的位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = (left + right)/2;
if(target > nums[mid]){
left = mid + 1;
}else if(target < nums[mid]){
right = mid - 1;
}else{
while(nums[left]!=target) left++;
while(nums[right]!=target) right--;
return new int[]{left,right};
}
}
return new int[]{-1,-1};
}
}
//时间复杂度:O(log N),最坏情况是O(N)