之前学校开了数据结构这门课,是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(); } }
相关推荐
典型的算法包括排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找、哈希查找等)、图的遍历(深度优先搜索DFS和广度优先搜索BFS)、动态规划、贪心算法以及回溯法等。...
### Java数据结构与算法——学习笔记 #### 一、引言 在计算机科学领域,**数据结构**与**算法**是两个极其重要的概念。数据结构指的是数据的组织方式,而算法则是解决特定问题的一系列步骤。这两者是编程的基础,...
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
这里涉及的主要算法类型有排序算法(如冒泡排序、快速排序、归并排序、堆排序)、查找算法(如线性搜索、二分查找)、图算法(如深度优先搜索、广度优先搜索)以及动态规划、贪心算法和回溯法等。排序算法用于调整...
- **查找算法**:线性查找、二分查找、哈希查找等,其中二分查找在有序数组中非常高效。 - **图算法**:深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra算法、Floyd算法等用于解决最短路径问题。 - **动态...
### Java数据结构与算法学习笔记知识点详解 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
Java数据结构与算法是计算机科学中的基础且至关重要的部分,它们是解决问题和设计高效程序的核心。本书《Java数据结构与算法(第二版)》显然深入探讨了这些主题,旨在帮助读者提升编程技能和理解复杂问题的解决策略...
- **二分查找**:在有序数组中查找目标元素,时间复杂度为O(log n)。 3. **递归与动态规划**: - **递归**:函数直接或间接调用自身,常用于解决分治问题,如斐波那契数列。 - **动态规划**:通过将原问题分解...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。在Java这门面向对象的编程语言中,数据结构和算法的实现具有独特的优势。本文将深入探讨Java中常见的数据结构,包括链表、树、图、数组和队列,...
总结而言,本文通过介绍算法与数据结构的基本概念,并深入探讨了二分查找这一经典算法的原理与实现细节,帮助读者更好地理解和掌握相关的基础知识。此外,还介绍了单路递归的概念及其与二分查找之间的联系,为进一步...
- **线性搜索与二分搜索**:在有序的顺序表中,二分搜索可以大大提高查找效率。 这个压缩包中的“数据结构和算法-3-顺序表.pdf”很可能是详细讲解顺序表的教程或笔记,包括其原理、操作、优缺点以及实践示例。通过...
在Java编程中,文件读取、数组操作、选择排序以及二分查找是常见的编程任务,它们涉及了IO流、数据结构和算法等多个方面。以下是这些知识点的详细解释: 1. **文件读取**:Java提供了丰富的IO流类库用于读取文件。...
根据提供的文件信息,“Java数据结构和算法中文第二版”这一标题和描述中提及的主要知识点集中在Java编程语言中的数据结构与算法。尽管这部分内容没有提供具体的章节或内容摘要,但我们可以根据这一主题推测书籍中...
二分查找算法是一种在有序数组中寻找特定元素的搜索算法,其效率远高于线性查找。这个算法基于分治策略,将查找范围不断减半,直到找到目标元素或者确定目标不存在。Java 中实现二分查找的基本步骤如下: 1. 首先,...
- **查找算法**:如线性查找、二分查找、哈希查找,用于在数据结构中找到特定元素。 - **图算法**:如深度优先搜索(DFS)、广度优先搜索(BFS)和最短路径算法(Dijkstra、Floyd-Warshall)。 - **动态规划**:...
搜索算法中,二分搜索在有序数组中寻找元素速度极快。 3. **示例代码**:这份资料包含的示例代码能够帮助读者亲手实现这些数据结构和算法,从而加深理解。通过编写和调试代码,可以更好地掌握每个数据结构和算法的...
【Java数据结构和算法笔记】 在Java编程中,数据结构和算法是核心概念,它们直接影响程序的效率和可维护性。本笔记主要基于《Java数据结构和算法》(第二版)一书,概述了各种常见数据结构的特性及经典算法。 1. **...