# 查找算法总结：顺序查找，二分查找，分块查找，散列查找，二叉排序树查找

B树用于查找磁盘数据，这里不进行分析

# 顺序查找

java实现：

public static int seqSearch(List<Integer> arr, int key) {
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i) == Integer.valueOf(key)) {
return i;
}
}
return -1;
}

# 二分查找

java实现:

//非递归实现
public static int binSearch(List<Integer> arr, int key, int low, int high) {
int middle = (low + high) / 2;
while (low < high) {
if (arr.get(middle) < key) {
low = middle + 1;
} else if (arr.get(middle) > key) {
high = middle - 1;
} else {
return middle;
}
middle = (low + high) / 2;
}
return -1;
}


//递归实现

/**
* 递归二分查找
* @param arr
* @param key
* @param low
* @param high
* @return
*/
public static int binSearchRecur(List<Integer> arr, int key, int low, int high) {

if (low > high)
return -1;
int middle = (low + high) / 2;
if (arr.get(middle) == key) {
return middle;
}
if (arr.get(middle) < key) {
return binSearchRecur(arr, key, middle + 1, high);
} else {
return binSearchRecur(arr, key, low, middle - 1);
}
}

public class Search {
public static void main(String[] args) {

System.out.println("请输入数组：");
List<Integer> arr = new ArrayList<Integer>();

int key = 0;
Scanner input = new Scanner(System.in);
String strInput = input.nextLine();
String[] inputs = strInput.split(" ");
for (int j = 0; j < inputs.length; j++) {
}

System.out.println("请输入要查找的数：");
key = input.nextInt();

System.out.println("顺序查找，找到的位置为：" + (seqSearch(arr, key)));

System.out.println("二分查找，找到的位置为：" + binSearch(arr, key, 0, arr.size() - 1));
System.out.println("递归二分查找，找到的位置为：" + binSearchRecur(arr, key, 0, arr.size() - 1));

}

public static int seqSearch(List<Integer> arr, int key) {
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i) == Integer.valueOf(key)) {
return i;
}
}
return -1;
}

public static int binSearch(List<Integer> arr, int key, int low, int high) {
int middle = (low + high) / 2;
while (low < high) {
if (arr.get(middle) < key) {
low = middle + 1;
} else if (arr.get(middle) > key) {
high = middle - 1;
} else {
return middle;
}
//每次缩小一半范围
middle = (low + high) / 2;
}
return -1;
}

/**
* 递归二分查找
* @param arr
* @param key
* @param low
* @param high
* @return
*/
public static int binSearchRecur(List<Integer> arr, int key, int low, int high) {

if (low > high)
return -1;
int middle = (low + high) / 2;
if (arr.get(middle) == key) {
return middle;
}
if (arr.get(middle) < key) {
return binSearchRecur(arr, key, middle + 1, high);
} else {
return binSearchRecur(arr, key, low, middle - 1);
}
}
}

# 分块查找

1.创建索引表。
2.在索引表内查找，在块内查找。

(分块查找索引表)平均查找长度=Log2（n/s+1）+s/2

(顺序查找索引表)平均查找长度=(S2+2S+n)/(2S)

①在表中插入或删除一个记录时，只要找到该记录所属的块，就在该块内进行插入和删除运算。
②因块内记录的存放是任意的，所以插入或删除比较容易，无须移动大量记录。
分块查找的主要代价是增加一个辅助数组的存储空间和将初始表分块排序的运算。

# 散列查找

[ 什么是散列表查找 ]

[ 散列技术的优缺点 ]

[ 散列函数构造方法 ]
1. 直接定址法：
2. 数字分析法：
3. 平方取中法：
4. 折叠法：
5. 除留余数法：
6. 随机数法：

[ 处理散列冲突的方法 ]
1. 开放地址法：
2. 再散列函数法：
3. 链地址法：
4. 公共溢出区法：

[ 散列表查找实现 ]

http://blog.chinaunix.net/uid-26981819-id-4462638.html 源码分析

[ 散列表查找性能分析 ]

# 二叉查找树查找

static class node{
int value;
node leftChild;
node rightChild;
}

public static node BSTSearch(node head,int key){
}else {
}
}

public static node BSTSearch(node head,int key){
}else{
}
break;
}
}
}

• 本文已收录于以下专栏：

## 三大查找算法总结：二分查找，分块查找和哈希表查找。

• XIAXIA__
• 2013年06月22日 22:06
• 2696

## java实现顺序查找、二分查找、哈希表查找、二叉排序树查找

java实现顺序查找、二分查找、哈希表查找、二叉排序树查找
• Rebirth_Love
• 2016年05月04日 16:43
• 1933

## 二分查找不一定比顺序查找到的效率高

• u010796650
• 2016年07月17日 23:02
• 912

## 算法-查找-线性表的查找（顺序查找，二分查找，分块查找）

• ahafg
• 2015年11月10日 11:57
• 1699

## 在二分搜索应用于未排序的数组时加入部分检测程序—编程珠玑第五章习题5

• chenglinhust
• 2012年08月16日 16:43
• 2153

## ZOJ题目分类

• Wss0130
• 2012年08月18日 09:54
• 9054

## 线性表的查找（顺序查找，二分查找，分块查找）

1.顺序查找 #include #include #define MAXSIZE 10 int a[MAXSIZE]={1,3,6,8,5,21,11,44,0,22}; typedef str...
• liguohanhaha
• 2016年02月03日 15:03
• 862

## 查找算法系列之简单查找：顺序查找、二分查找、分块查找

• u010025211
• 2015年06月25日 13:20
• 4160

## 查找算法总结：顺序查找，二分查找，分块查找，散列查找，二叉排序树查找

• Houson_c
• 2016年08月29日 20:56
• 897

## //写一个生成10个100以内随机数数据，再进行冒泡排序，顺序，//二分查找法找到一个值得位置，如果没有则为-1，有则返回数组位置

//写一个生成10个100以内随机数数据，再进行冒泡排序，顺序 public static void main(String[] args) { int[] arr=new int[10]; f...
• u011163023
• 2016年03月10日 17:32
• 2179

举报原因： 您举报文章：查找算法总结：顺序查找，二分查找，分块查找，散列查找，二叉排序树查找 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)