package Exer;
/**
* 二分查找:
* 【必须是已经排序好的数组】
* 时间复杂度:最好情况:O(logN)最坏情况下是:O((N))
*步骤:
* 先排序 再查找
* target要查找的数
* index:为target的下标
* arr[]:待查找的数组
*/
public class BinarySeek {
public static void swap(int []arr,int i,int j)
{
int tamp = arr[i];
arr[i] = arr[j];
arr[j] = tamp;
}
//这里我们用快速排序来排序,快速排序的相关说明已经在之前的文章中有说明
public static void Sort(int []arr,int start,int end)
{
if(start < end)
{
int temp = arr[start];
int low = start;
int high = end + 1;
while(true)
{
while(low < end && arr[++low] <= temp)
;
while(high > start && arr[--high] >= temp)
;
if(high > low)
{
swap(arr,high,low);
}
else {
break;
}
}
swap(arr,start,high);
//调用递归,进行排序
Sort(arr,start, high-1);
Sort(arr,high+1,end);
}
}
public static void Binary(int []arr,int start,int end)
{
int target = 100;//设置要查找的目标元素
int index =-1;//将目标元素的下表先赋值为-1
int counter = 0;//用作记循环的次数
while(start <= end)
{//进入循环,进行查找
counter++;
int mid = (start + end) /2 ;
if(arr[mid]==target)
{//如果找到,就将下标赋值给index,然后跳出循环
index = mid;
break;
}
else if(arr[mid] < target)
{//如果中间元素小于目标元素,则缩小范围继续查找
start = mid +1;
}
else if (arr[mid] >target)
{//如果中间元素大于目标元素,则继续缩小范围进行查找
end = mid -1;
}
}//当跳出循环时会出现两种情况,要么找到目标元素,跳出循环,要么找不到,循环结束。
//因为index起始赋值为-1,所以当index不等于-1时,则说明找到指定元素
if(index != -1)
{
System.out.println("二分查找的目标元素是: " + target + "\t" + "所在的索引位置是:" + index);
System.out.println("查找次数是:" + counter);
}//反之,index的值没变,还是-1,没找到
else{
System.out.println("没找到目标元素:" + target);
System.out.println("查找次数是:" + counter);
}
}
public static void main(String[] args) {
//提前排好序
int []arr = {12,12,3,-23,45,6,5,6,56,5,-545,45,53,-98,42,-6765,-68,0,5676};
System.out.println("排序前:" + java.util.Arrays.toString(arr));
Sort(arr,0,arr.length-1);
System.out.println("排序后:" + java.util.Arrays.toString(arr));
System.out.println("————进入二分法查找————");
Binary(arr,0,arr.length-1);
}
}
以上的排序方法是快速排序,快速排序的详解在之前的文章中有说明(点击下面连接即可)
http://t.csdn.cn/s4btdhttp://t.csdn.cn/s4btd运行结果: