`

java数据结构与算法---有序数组的二分查找

 
阅读更多

之前学校开了数据结构这门课,是C语言版的,没认真学,只好现在来补一补了皱眉

首先要说的是必须是有序的,不然是没办法用二分法查找的

1.有序数组优缺点

优点:查找速度(采用二分查找法)比无序数组快很多(查找的数据量越大,优势越明显)

下面是一组用二分法查找的数据:

数据量                                                               所需比较次数

10                                                                            4

100                                                                          7

1000                                                                        10

10000                                                                      14

100000                                                                    17

1000000                                                                   20

10000000                                                                 24

100000000                                                               27

缺点:插入时需要将后面的元素进行移动

2.然后下面是我实现有序数组二分查找的代码:

package ordarray;
/**
 * 有序数组
 * @author zhang
 *
 */
public class OrdArray {
	private long[] a;
	private int nElems;
	
	public OrdArray(int max){
		a= new long[max];
		nElems=0;
	}

	//二分查找方法
	public int find(long serachKey){
		int lowerBound=0;
		int upperBound=nElems-1;
		int curIn;
		while(true){
			curIn=(lowerBound+upperBound)/2;
			if(a[curIn]==serachKey){
				return curIn;
			}else if(lowerBound>upperBound){
				return nElems;
			}else{
				if(a[curIn]<serachKey){//往后查
					lowerBound=curIn+1;//改变最小索引
				}else{//往前查
					upperBound=curIn-1;//改变最大索引
				}				
			}
		}
	}
	//二分法删除
	public boolean delete2(long value){
		int i=find(value);
		if(i==nElems){
			return false;
		}else{
			for(int j=i;j<nElems;j++){
				a[j]=a[j+1];
			}
			nElems--;
			return true;
		}
	}
	
	public int size(){//查看大小,元素个数
		return nElems;
	}
	
	//添加数据(线性查找添加)插入一定是可以插入的,不像删除要查看要删除的元素是否存在
	//从小到大排序插入
	public void insert(long value){
		int i;
		for(i=0;i<nElems;i++){
			if(a[i]>value){
				break;
			}
		}
		//j>i每次判断j是否大于我们停止的i位置
		for(int j=nElems;j>i;j--){
			//必须从最后一个开始移
			a[j]=a[j-1];				
		}
		//最后插入我们要插入的元素
		a[i]=value;	
		nElems++;
	}
	
	//删除
	public boolean delete(long value){
		int i;
		for(i=0;i<nElems;i++){
			if(a[i]==value){
				break;
			}
		}
		if(i==nElems){
			System.out.println("删除失败,没有"+value+"这个值");
			return false;
		}else{
			for(int j=i;j<nElems;j++){
				a[j]=a[j+1];
			}
			nElems--;
			return true;
		}			
		
	}
	
	public void display(){
		for(int i=0;i<nElems;i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}

 

package ordarray;

public class OrderedApp {
	public static void main(String[] args) {
		int maxSize=100;
		OrdArray arr;
		arr=new OrdArray(maxSize);
		arr.insert(77);
		arr.insert(66);
		arr.insert(76);
		arr.insert(79);
		arr.insert(44);
		arr.insert(55);
		arr.insert(34);
		arr.insert(23);
		arr.insert(66);
		arr.insert(97);
		int serachKey=76;
		if(arr.find(serachKey)!=arr.size()){
			System.out.println("找到了"+serachKey);
		}else{
			System.out.println("没有找到"+serachKey);
		}
		arr.display();
		
		arr.delete2(23);
		arr.delete2(66);
		arr.display();
	}
}

 

分享到:
评论

相关推荐

    java数据结构与算法第二版

    Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小...

    Java数据结构和算法中文第二版

    Java数据结构和算法介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和队列、链表、...

    详解Java数据结构和算法(有序数组和二分查找)

    本篇文章主要介绍了详解Java数据结构和算法(有序数组和二分查找),具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java数据结构和算法中文第二版(1)

    递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树...

    Java数据结构和算法(第二版)

    Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验...

    Java数据结构和算法中文第二版(2)

    Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? ...

    《算法导论》第二版中文全集,含:全世界唯一带“完整”目录的版本,代码。第2部分(共4部分)。学好核心技术,既为自己,也为天空不落下别国的炸弹

    数据结构教材 我强烈推荐Sartaj Sahni著《数据结构算法与应用 C++语言描述》 这是一部难得的好书 作者循序渐进 娓娓道来 每一种数据结构和算法都给出了详细的实现代码和运行结果 而且代码质量极高 甚至可以直接照搬...

    数据结构与算法.xmind

    数据结构与算法 排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾中 做法 外层for循环控制次数 内层for循环找出最大的值的角...

    数据结构与算法(JAVA篇)之递归算法(二)

    * 递归的二分查找: 想用最少的比较次数在一个有序的数组中找到一个给定的数据项。 * * 非递归的二分查找:二分查找也可以用非递归的算法,但是分治算法通常要回到递归。分治算 * 法常常是一个方法,在这个...

    Java语言-数据结构与算法视频教程 (第一部分)

    ____18.JavaDS_有序链表.mp4 |____17.JavaDS_用链表实现抽象...|____04.JavaDS_有序数组和二分查找.mp4 |____03.JavaDS_数组基础知识.mp4 |____02.JavaDS_数据结构和算法的概述.mp4 |____01.NetBeans_下载和安装.mp4

    算法-第4版-完整版

    3.1.5 有序数组中的二分查找 238 3.1.6 对二分查找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 分析 255 3.2.3 有序性相关的方法与删除操作 257 3.3 平衡查找树...

    50个必会的数据结构及算法实现源码

    数组 问题:实现一个支持动态扩容的数组 问题:实现一个大小固定的...二分查找、散列表、字符串处理、二叉树、堆、图、回溯、分治、动态回归等。 资源中包括常用语言:c、java、python、go等实现源码,方便参考学习。

    算法第四版-PDF-网盘链接

     3.1.5 有序数组中的二分查找 238  3.1.6 对二分查找的分析 242  3.1.7 预览 244  3.2 二叉查找树 250  3.2.1 基本实现 250  3.2.2 分析 255  3.2.3 有序性相关的方法与删除操作 257  3.3 ...

    JavaDS:Java数据结构和算法

    ##Java数据结构与算法数组栈队列:优先级队列链表:单链表 双端链表 有序链表 双向链表 链表ADT二叉树:完全二叉树 红黑树堆图哈希表递归###查找:二分查找###排序:冒泡排序选择排序插入排序希尔排序归并排序快速...

    DataStructuresAndAlgorithms:Java中常见的数据结构和算法

    二分查找 数据结构 大批 有序数组 链表 双向链表 堆栈(基于数组和基于链表) 队列(基于数组和基于链表) 两个堆栈(使用一个数组实现两个堆栈) 双端队列 二叉搜索树 堆(最大和最小堆) 哈希表 常见问题 细绳...

    《算法》中文版,Robert Sedgewick,塞奇威克

    3.1.5 有序数组中的二分查找 3.1.6 对二分查找的分析 3.1.7 预览 3.2 二叉查找树 3.2.1 基本实现 3.2.2 分析 3.2.3 有序性相关的方法与删除操作 3.3 平衡查找树 3.3.1 2-3查找树 3.3.2 红黑二叉查找树 ...

    算法 第4版-谢路云译-带完整书签

    3.1.5 有序數组中的二分查找 238 3.1.6 对二分査找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 分析 255 3.2.3 有序性相关的方法与删除操作 257 3.3 平衡査找树 269 ...

    算法 第4版 高清中文版

    3.1.5 有序数组中的二分查找 238 3.1.6 对二分查找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 分析 255 3.2.3 有序性相关的方法与删除操作 257 3.3 平衡查找树 269 3.3.1 2-3...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    3.1.5 有序数组中的二分查找 3.1.6 对二分查找的分析 3.1.7 预览 3.2 二叉查找树 3.2.1 基本实现 3.2.2 分析 3.2.3 有序性相关的方法与删除操作 3.3 平衡查找树 3.3.12—3查找树 3.3.2 红黑二叉查找树 ...

Global site tag (gtag.js) - Google Analytics