java 详细实现二分查找算法
2016-12-03 17:23
357 查看
java详细实现二分查找的算法
一:二分查找简介:
1:名称简介-----------二分查找又叫折半查找,针对的是是有序表(升序获降序的数组)。
2:原理介绍:
二分查找是以处在有序表区间中间位置记录的关键字与给定的查找元素进行比较的,如果相等就表示查找成功了,如果不相等就缩小查找范围,知道新的区间的中间位置的记录的关键字等于给定的查找元素或者就是查找失败了(查找区间为零);
就是每次将有序表折半与目标元素进行比较的。时间复杂度:查找时间为O(lgn),类比于一边的数组for遍历的时间复杂度为O(n);
3:性能分析:二分查找的查找效率比顺序查找高很多的。但是只是适用于有序表的顺序存储结构,而链式存储就无法有效的使用了。如果已二叉树来分析可能就要复杂许多了。
4:举例说明:
譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
java源程序如下的
package com.lx.text01;
import java.util.Scanner;
/**
* 测试二分查找:不断将数组进行对半分割,每次拿中间元素和要查找的目标元素进行比较。
* @author 李星
* 定义全局变量的时候:就在全局类里面定义公共静态变量
*/
public class ErFenCha {
//声明存储数组的大小和要查找的次数;
public static int a[]=new int[25];
public static int count=0;
//查找算法1,如果有序表的中位数大于要查找的数,这个是按照升序排序的有序表
public static void FindAscending(int low,int high,int x){
int mid;
//用于记录每次二分的中位数
int temp;
if(low<high){
mid=(low+high)/2;
count++;
if(a[mid]>x){
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
FindAscending(low,mid-1,x);
}
else if(a[mid]<x){
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
FindAscending(mid+1,high,x);
}
else{
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
System.out.println("升序的有序表中查找到元素的位置是:"+mid+" "+"查找到该元素共花费了:"+count+"次");
}
}
else{
System.out.println("该升序的有序数组中没有您要查找的元素哎!,在好好检查一下吧!");
}
}
//查找算法二按照降序排序的查找算法实现
public static void FindDiscending(int high,int low,int x){
int mid;
int temp;
if(high>low){
mid=(high+low)/2;
count++;
if(a[mid]>x){
temp=a[mid];
System.out.println("本次二分的中位数为:"+temp);
FindDiscending(mid+1,low,x);
}
else if(a[mid]<x){
temp=a[mid];
System.out.println("本次二分的中位数为:"+temp);
FindDiscending(high,mid-1,x);
}
else{
temp=a[mid];
System.out.println("本次二分的中位数为;"+temp);
System.out.println("降序的有序表中查找的元素的位置为:"+mid+" "+"查找到该元素共花费了:"+count+"次");
}
}
else{
System.out.println("该降序的有序数组中没有您要查找的元素哎!,在好好检查一下吧");
}
}
public static void main(String[] args) {
//有序表的数据读入;
int n,x;
@SuppressWarnings("resource")
Scanner cin=new Scanner(System.in);
System.out.println("请输入您的有序表的元素:");
System.out.println("-------------");
n=cin.nextInt();
System.out.println("请按照升序或降序的顺序的顺序读入有序表中的元素:");
System.out.println("-------------");
//将读入的数据存入到有序表中:
for(int i=1;i<=n;i++){
a[i]=cin.nextInt();
}
//输入您要查找的元素
System.out.println("输入您要查找的元素:");
x=cin.nextInt();
//判断读入的有序表是升序还是降序将调用相应的方法
if(a[1]<=a
){
FindAscending(1,n,x);
//返回刚才输入要查询的元素;
System.out.println("返回了您将才要查找的元素:"+x);
}
else{
FindDiscending(n,1,x);
//返回刚才输入要查询的元素;
System.out.println("返回了您将才要查找的元素:"+x);
}
System.out.println("至此二分查找的算法就完美的实现完毕了!");
}
}
运行截图如下:1-是按照升序的有序表查找元素的运行结果:
2-是按照降序的有序表查找元素的运行结果:
至此java实现二分查找就到此结束了。喜欢顶一个哈。大神不喜欢也别喷哈。给小弟留个建议也好呀。
一:二分查找简介:
1:名称简介-----------二分查找又叫折半查找,针对的是是有序表(升序获降序的数组)。
2:原理介绍:
二分查找是以处在有序表区间中间位置记录的关键字与给定的查找元素进行比较的,如果相等就表示查找成功了,如果不相等就缩小查找范围,知道新的区间的中间位置的记录的关键字等于给定的查找元素或者就是查找失败了(查找区间为零);
就是每次将有序表折半与目标元素进行比较的。时间复杂度:查找时间为O(lgn),类比于一边的数组for遍历的时间复杂度为O(n);
3:性能分析:二分查找的查找效率比顺序查找高很多的。但是只是适用于有序表的顺序存储结构,而链式存储就无法有效的使用了。如果已二叉树来分析可能就要复杂许多了。
4:举例说明:
譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
java源程序如下的
package com.lx.text01;
import java.util.Scanner;
/**
* 测试二分查找:不断将数组进行对半分割,每次拿中间元素和要查找的目标元素进行比较。
* @author 李星
* 定义全局变量的时候:就在全局类里面定义公共静态变量
*/
public class ErFenCha {
//声明存储数组的大小和要查找的次数;
public static int a[]=new int[25];
public static int count=0;
//查找算法1,如果有序表的中位数大于要查找的数,这个是按照升序排序的有序表
public static void FindAscending(int low,int high,int x){
int mid;
//用于记录每次二分的中位数
int temp;
if(low<high){
mid=(low+high)/2;
count++;
if(a[mid]>x){
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
FindAscending(low,mid-1,x);
}
else if(a[mid]<x){
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
FindAscending(mid+1,high,x);
}
else{
temp=a[mid];
System.out.println("本次二分的结果为:"+temp);
System.out.println("升序的有序表中查找到元素的位置是:"+mid+" "+"查找到该元素共花费了:"+count+"次");
}
}
else{
System.out.println("该升序的有序数组中没有您要查找的元素哎!,在好好检查一下吧!");
}
}
//查找算法二按照降序排序的查找算法实现
public static void FindDiscending(int high,int low,int x){
int mid;
int temp;
if(high>low){
mid=(high+low)/2;
count++;
if(a[mid]>x){
temp=a[mid];
System.out.println("本次二分的中位数为:"+temp);
FindDiscending(mid+1,low,x);
}
else if(a[mid]<x){
temp=a[mid];
System.out.println("本次二分的中位数为:"+temp);
FindDiscending(high,mid-1,x);
}
else{
temp=a[mid];
System.out.println("本次二分的中位数为;"+temp);
System.out.println("降序的有序表中查找的元素的位置为:"+mid+" "+"查找到该元素共花费了:"+count+"次");
}
}
else{
System.out.println("该降序的有序数组中没有您要查找的元素哎!,在好好检查一下吧");
}
}
public static void main(String[] args) {
//有序表的数据读入;
int n,x;
@SuppressWarnings("resource")
Scanner cin=new Scanner(System.in);
System.out.println("请输入您的有序表的元素:");
System.out.println("-------------");
n=cin.nextInt();
System.out.println("请按照升序或降序的顺序的顺序读入有序表中的元素:");
System.out.println("-------------");
//将读入的数据存入到有序表中:
for(int i=1;i<=n;i++){
a[i]=cin.nextInt();
}
//输入您要查找的元素
System.out.println("输入您要查找的元素:");
x=cin.nextInt();
//判断读入的有序表是升序还是降序将调用相应的方法
if(a[1]<=a
){
FindAscending(1,n,x);
//返回刚才输入要查询的元素;
System.out.println("返回了您将才要查找的元素:"+x);
}
else{
FindDiscending(n,1,x);
//返回刚才输入要查询的元素;
System.out.println("返回了您将才要查找的元素:"+x);
}
System.out.println("至此二分查找的算法就完美的实现完毕了!");
}
}
运行截图如下:1-是按照升序的有序表查找元素的运行结果:
2-是按照降序的有序表查找元素的运行结果:
至此java实现二分查找就到此结束了。喜欢顶一个哈。大神不喜欢也别喷哈。给小弟留个建议也好呀。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)