数据结构和算法-005 数组排序 二分法检索

二分法检索

二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组array)中,

首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;

否则,若key小,则在字典前半部分中继续进行二分法检索;

若key大,则在字典后半部分中继续进行二分法检索。

这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。

偶数个取中间2个其中任何一个作为中间元素

二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。

Note:参考百度百科  http://baike.baidu.com/link?url=tXUjYUD9FGGzlbHkfLOyMteFEMdWWpvmg9OwJf4rUEuSs6msTQVTw1JhmjDMbMoQAuEf6iNgGPWHX704aF188_

看代码

public class ArrayStructures {

	private int[] theArray = new int[50];

	private int arraySize = 10;

	public void generateRandomArray(){
		for (int i =0; i< arraySize;i++){
			theArray[i] = (int)(Math.random()*10 + 10);
		}
	}

	public void printArray(){
		StringBuffer sb = new StringBuffer("-");
		for (int i = 0; i<arraySize; i++){
			sb.append("-----");
		}

		String septalLine= sb.toString();

		System.out.println(septalLine);
		for (int i = 0; i<arraySize; i++){
			System.out.print("|  " + i + " ");
		}
		System.out.println("|");
		System.out.println(septalLine);
		for (int i = 0; i<arraySize; i++){
			System.out.print("| " + theArray[i] + " ");
		}
		System.out.println("|");
		System.out.println(septalLine);
	}

	public void insertionSort(){
		for(int i=1; i<arraySize; i++){
			int j= i;
			int insertValue = theArray[i];
			while (j>0 && theArray[j-1]>insertValue){
				theArray[j]= theArray[j-1];
				j--;
			}
			theArray[j]=insertValue;
		}
	}

	public void binarySearchForValue(int value){
		int lowIndex = 0;
		int highIndex = arraySize -1;

		while(lowIndex<= highIndex){
			int middleIndex = (lowIndex +highIndex)/2;
			if(theArray[middleIndex] < value) lowIndex = middleIndex + 1;
			else if(theArray[middleIndex] > value) highIndex = middleIndex - 1;
			else {
				System.out.println("The value " + value +" at Index " + middleIndex);
				return;
			}
		}

		System.out.println("The value " + value +" is not in this array");
	}

	public static void main(String[] args) {
		// Generate an Array 
		System.out.println("Create an array, and fill in random value");
		ArrayStructures as = new ArrayStructures();
		// Set Random value in Array 
		as.generateRandomArray();
		// Print original array 
		as.printArray();
		System.out.println();

		System.out.println("Insertion Sort");
		as.insertionSort();
		as.printArray();
		System.out.println();

		System.out.println("Binary Search");
		as.binarySearchForValue(14);
		System.out.println();
	}

}

输出结果

Create an array, and fill in random value
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 11 | 12 | 13 | 14 | 18 | 14 | 19 | 11 | 17 | 19 |
---------------------------------------------------

Insertion Sort
---------------------------------------------------
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |
---------------------------------------------------
| 11 | 11 | 12 | 13 | 14 | 14 | 17 | 18 | 19 | 19 |
---------------------------------------------------

Binary Search
The value 14 at Index 4
时间: 2024-11-06 03:28:50

数据结构和算法-005 数组排序 二分法检索的相关文章

数据结构和算法-011 数组排序 快速排序

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 1算法介绍 快排图 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数

数据结构和算法-002 数组排序 冒泡排序

冒泡排序 1算法原理 1. 冒泡排序算法的运作如下:(从后往前) 2. 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 3. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 4. 针对所有的元素重复以上的步骤,除了最后一个. 5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 2算法分析 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数  均达到最小值: ,. 所

数据结构和算法之:二分法demo

package com.js.ai.modules.pointwall.testxfz; class OrdArray{ private long[] a; private int nElems; public OrdArray(int max) { a=new long[max]; nElems=0; } public int size(){ return nElems; } //插入方法 public void insert(long value){ int j; for(j=0;j<nEl

我的软考之路(七)——数据结构与算法(5)之查找

上篇博文我重点介绍了八大内部排序,这篇博文(数据结构与算法的最后一课)重点介绍查找,我们依旧沿用上篇博文的风格,先简单介绍,再以例子重点讲解. 下面我们开始今天的旅行,首先祝你旅行愉快,呵呵. 静态查找 若查找目的是为了查询某个特定的数据是否在表中或检索某个特定数据的各种属性,则此类查找表为静态查找表. 1.顺序查找 基本原理:从表一端开始逐个和关键字进行比较,若找到一个记录和给定值相等,则查找成功,反之失败.再简单点就是,一个一个的比大小,看看是否相等. 例子: 顺序查找更适合于顺序存储结构和

php面试题之二——数据结构和算法(高级部分)

二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class Test implements Iterator{ private $item = array('id'=>1,'name'=>'php'); public function rewind(){ reset($this->item); } public function current(){

《数据结构与算法JavaScript描述》

<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115363398 上架时间:2014-8-5 出版日期:2014 年8月 开本:16开 版次:1-1 所属分类:计算机 > 软件与程序设计 > 网络编程 > javascript 更多关于>>> <数据结构与算法JavaScript描述> 编辑推荐 随着

《Java数据结构和算法》- 哈希表

Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工

JavaScript数据结构和算法

前言 在过去的几年中,得益于Node.js的兴起,JavaScript越来越广泛地用于服务器端编程.鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言(比如C++和Java)提供的工具.这些工具包括传统的数据结构(如链表,栈,队列,图等),也包括传统的排序和查找算法.本文主要是总结什么情况下使用何种数据结构较好,并没有细讲里面的原理和实现方式,仅仅提供给阅读过<数据结构和算法>的同学作为总结和参考笔记,如果未细究过数据结构和算法的同学,本文也可以作为一个方向,希望能引

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ