二分查找

来源:互联网 发布:淘宝上开店在哪里进货 编辑:程序博客网 时间:2024/05/17 23:39
package com.ali.demo;import java.util.Random;public class BinarySearch {/** 比较两次 */public int searchOne(int a[], int k) {int l = 0;int u = a.length - 1;int mid = 0;while (l <= u) {mid = (l + u) / 2;if (a[mid] == k) {return mid;} else if (a[mid] < k) {l = mid + 1;} else {u = mid - 1;}}return -1;}/** 比较一次 */public int searchTwo(int a[], int k) {int l = -1;int u = a.length;int m = 0;while ((l + 1) != u) {m = (l + u) / 2;if (a[m] < k) {l = m;} else {u = m;}}int p = u;if (p >= a.length || a[p] != k) {p = -1;}return p;}public int searchThree(int a[], int k) {int i = 512;int l = -1;if (a[511] < k) {l = 1000 - 512;}while (i != 1) {int nexti = i / 2;if (a[l + nexti] < k) {l = l + nexti;i = nexti;} else {i = nexti;}}int p = l + 1;if (p > 1000 || a[p] != k) {p = -1;}return p;}public int searchFour(int a[], int k) {int i = 512;int l = -1;if (a[511] < k) {l = 1000 - 512;}while (i != 1) {i = i / 2;if (a[l + i] < k) {l = l + i;}}int p = l + 1;if (p > 1000 || a[p] != k) {p = -1;}return p;}public int searchFive(int a[], int k) {int l = -1;if (a[511] < k)l = 1000 - 512;if (a[l + 256] < k)l += 256;if (a[l + 128] < k)l += 128;if (a[l + 64] < k)l += 64;if (a[l + 32] < k)l += 32;if (a[l + 16] < k)l += 16;if (a[l + 8] < k)l += 8;if (a[l + 4] < k)l += 4;if (a[l + 2] < k)l += 2;if (a[l + 1] < k)l += 1;int p = l + 1;if (p > 1000 || a[p] != k) {p = -1;}return p;}public static void main(String[] args) {BinarySearch search = new BinarySearch();final int NUM = 1000000;int[] a = new int[1000];for (int i = 1; i < 1000; i++) {a[i - 1] = i;}int k = (new Random()).nextInt(1000) + 1;System.out.println("Key = " + k);long ts = System.currentTimeMillis();for (int i = 1; i < NUM; i++) {search.searchOne(a, k);}System.out.println(System.currentTimeMillis() - ts);ts = System.currentTimeMillis();for (int i = 1; i < NUM; i++) {search.searchTwo(a, k);}System.out.println(System.currentTimeMillis() - ts);ts = System.currentTimeMillis();for (int i = 1; i < NUM; i++) {search.searchThree(a, k);}System.out.println(System.currentTimeMillis() - ts);ts = System.currentTimeMillis();for (int i = 1; i < NUM; i++) {search.searchFour(a, k);}System.out.println(System.currentTimeMillis() - ts);ts = System.currentTimeMillis();for (int i = 1; i < NUM; i++) {search.searchFive(a, k);}System.out.println(System.currentTimeMillis() - ts);}}

0 0