学习《轻松学算法》
一顺序查找
给定一个数列和一个数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;
}
/**
* 优化查找 将key的值放到数组下标为0的元素上,从后往前查找,直到k与某数相同
* @param key
* @return
*/
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;}}
二 二分查找
条件
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;
}
}