每天学一点算法-二分查找算法

二分查找算法


定义


二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn) 。


时间复杂度


O(logn)


代码


package com.sprd.test.algorithm;

import java.util.Scanner;

/**
 * Copyright 2014 TJ SPREADTRUM TEST_AF All Right Reserved
 * 
 * @author: hui.qian Created on 2014年11月27日 上午9:37:20 Description:
 */
public class BinarySearch {

	public int find(int[] data, int b) {
		if (data.length == 0) {
			System.out.println("当前数组没有这个数");
			return -1;
		}
		int length = data.length;
		int index = length / 2;
		int center = data[index];
		if (center == b) {
			return index;
		} else if (center < b) {
			int[] right = new int[length - length / 2 - 1];
			for (int i = 0; i < right.length; i++) {
				right[i] = data[index + 1 + i];
			}
			return index + find(right, b) + 1;
		} else {
			int[] left = new int[length / 2];
			for (int i = 0; i < left.length; i++) {
				left[i] = data[i];
			}
			return find(left, b);
		}
	}

	public int findRecur(int start, int end, int b) {

		return 0;
	}

	public static void main(String[] args) {
		int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		Scanner scanner = new Scanner(System.in);
		System.out.println("数组 : ");
		print(a);
		while (true) {
			Integer b = 0;
			System.out.println("请输入你要查找的数 : ");
			b = scanner.nextInt();
			long start = System.currentTimeMillis();
			int index = new BinarySearch().find(a, (int) b);
			System.out.println(b + "所在的 索引 : " + index);
			long end = System.currentTimeMillis();
			//System.out.println("耗时 : " + (end - start));
		}
		
	}

	public static void print(int[] datas) {
		for (int i = 0; i < datas.length; i++) {
			System.out.print(datas[i] + " ");
		}
		System.out.println("");
	}
}

输出


数组 : 
1 2 3 4 5 6 7 8 9 
请输入你要查找的数 : 
9
9所在的 索引 : 8
请输入你要查找的数 : 
7
7所在的 索引 : 6
请输入你要查找的数 : 
0
当前数组没有这个数
0所在的 索引 : -1
请输入你要查找的数 : 
1
1所在的 索引 : 0
请输入你要查找的数 : 



你可能感兴趣的:(算法与数据结构,LeetCode)