1、算法思想
二分查找采用分而治之的思想。要求被查找的集合必须是有序的。主要思路:
- 根据起始位置和结束位置,确定中间位置。
- 拿目标值与中间位置的值做比较,假如目标值大于中间位置取值,则起始位置为中间位置加1。
- 假如目标值小于中间位置取值,则结束位置为中间位置减1。
- 直至起始位置小于等于结束位置,找到目标值的位置即索引。
2、代码实现
2.1、基于Python3.x实现
代码如下:
1 #coding:utf-8 2 def half_search(lst,key): 3 start = 0 4 end = len(lst) - 1 5 while start <= end: 6 mid = int(start + end / 2) 7 if lst[mid] > key: 8 end = mid - 1 9 elif lst[mid] < key: 10 start = mid + 1 11 else: 12 print("Matched the index of key %s is %s" %(lst[mid],mid)) 13 return mid 14 return -1 15 l=[1,2,3,5,7] 16 half_search(l,2)
运行结果:
Matched the index of key 2 is 1
2.2、基于shell实现
代码如下:
1 #/bin/bash 2 function BinSearch(){ 3 declare -a arr=($1) 4 key=$2 5 start=0 6 end=`expr ${#arr[*]} - 1` 7 while [ ${start} -le ${end} ] 8 do 9 declare -i mid=$(((start+end)/2)) 10 if [ ${arr[mid]} -lt ${key} ];then 11 start=$((mid+1)) 12 elif [ ${arr[mid]} -gt ${key} ];then 13 end=$((mid-1)) 14 else 15 echo ${mid} 16 break 17 fi 18 19 20 done 21 } 22 arr=(1 2 3 5 7 9) 23 echo "Index of 2 is:$(BinSearch "${arr[*]}" 2)"
运行结果:
Index of 2 is:1
2.3、基于Java实现
代码如下:
1 class binSearch{ 2 //定义二分查找的函数 3 public static int binSearch(int[] arr,int key){ 4 int start=0; 5 int end=arr.length - 1; 6 //int mid=(start+end) /2; 7 while(start<=end){ 8 int mid = (start + end) / 2; 9 if(arr[mid]<key){ 10 start=mid+1; 11 } 12 else if(arr[mid]>key){ 13 end=mid-1; 14 } 15 else{ 16 System.out.print("Matched,index is:"); 17 return mid; 18 } 19 20 } 21 return -1; 22 } 23 //验证二分查找 24 public static void main(String[] args){ 25 int key=2; 26 int[] arr={1,2,3,5,7,9}; 27 int keyIndex=binSearch(arr,key); 28 System.out.print(keyIndex); 29 } 30 }
运行结果:
Matched,index is:1