学习《轻松学算法》
一顺序查找
给定一个数列和一个数key,找出第一个与key相同的数的下标。
原理:从数列开始一个一个进行比较,这个还是比较简单的。
package xxc.algorithm.ch04.SequentialSearch; public class SequentialSearch { private int[] array; public SequentialSearch(int[] array) { this.array=array; } /** * 直接顺序查找 * @param key * @return */ public int search(int key) { for(int i=0;i<array.length;i++) { if (key == array[i]) { return i; } } return -1; }
public int search2(int key) {if(key==array[0]) {return 0;}int temp = array[0];array[0]=key;int i = array.length-1;while (array[i]!=key) {i--;}array[0]=temp;if (i==0) {return -1;}return i;}}/** * 优化查找 将key的值放到数组下标为0的元素上,从后往前查找,直到k与某数相同 * @param key * @return */
细细比较这两个顺序查找就会发现,两者还是会有差异的。当数列存在相同元素时,前者输出从前往后的相同元素下标,后者输出从后往前的相同元素下标。尽管两者找出的数与key相同,但是找出的数在数列中的位置是不同的。
二 二分查找
条件
1 需要数列有序
2 需要数列使用顺序存储结构
过程:
假设数列从小到大排列,比较一个元素key与数列中间位置的大小,假如key大,那么在中间位置至末尾的数列的子数列中进行二分查找;如果key小,在开头至中间位置的数列的子数列中进行二分查找。每次查找的数列都是前一次数列的一半。
package xxc.algorithm.ch04.BinarySearch; public class BinarySearch { private int[] array; public BinarySearch(int[] array) { this.array = array; } public int searchRecursion(int target) { if (array != null) { return searchRecursion(target, 0, array.length); } return -1; } public int searchRecursion(int target, int start, int end) { if (start>end) { return -1; } int mid = (start+end)/2; if (array[mid] == target) { return mid; }else if (target<array[mid]) { return searchRecursion(target, 0, mid-1); //递归查找 }else { return searchRecursion(target, mid+1, end); } } public int search(int target) { if(array == null) { return -1; } int start = 0; int end = array.length-1; while(start<=end) { int mid = start+(end-start)/2; if (array[mid]==target) { return mid; }else if (target<array[mid]) { end = mid-1; }else { start = mid+1; } } return -1; } }