读书人

数据结构之根本查找算法

发布时间: 2013-10-28 11:21:45 作者: rapoo

数据结构之基本查找算法
public static int seqSearch(int[] arr, int key){for (int i=0; i<arr.length; i++){if (key == arr[i])return i;}return -1;}

?

?

二分查找

针对已经有序的数组,可以使用二分查找,又称折半查找

public static int binarySearch(int[] arr, int key){int low =0;int high = arr.length -1;while(low <= high){int mid = (low + high)/2;++bcount;if (key>arr[mid]) {low = mid + 1;} else if (key ==arr[mid]){return mid;} else {high = mid -1;}} return -1;}

?

?

插值查找

在折半查找中,?mid = (low + high)/2 = low + (high - low)/2,我们将右边的1/2替换为 (key-arr[low])/(arr[high]-arr[low])

当key ==arr[low]的时候 mid = low, mid往最左边移动当key== arr[high]的时候, mid=high, mid往最右边活动

可见这是一种更聪明更有倾向性的查找方法

?

public static int chazhiSearch(int[] arr, int key){int low =0;int high = arr.length -1;while(low <= high){++ccount;int mid = low + ((key-arr[low])*(high-low)/(arr[high]-arr[low]));if (key>arr[mid]) {low = mid + 1;} else if (key ==arr[mid]){return mid;} else {high = mid -1;}} return -1;}

?

测试代码

public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5,6,8,9,12,15,18,20};assert(seqSearch(array, 9) == 7);assert(seqSearch(array, 8)== -1);System.out.println(binarySearch(array, 18));System.out.println(chazhiSearch(array, 18));System.out.println("bcount: " + bcount);System.out.println("ccount: " + ccount);}

?

?运行结果:

1010bcount: 3ccount: 2

?对于这种分布比较均匀的数列,插值查找的次数要比二分查找少

读书人网 >编程

热点推荐