持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
顺序查找与折半查找
顺序查找
从线性表的一边开始,逐个检查每个关键字是否满足条件。在顺序查中,引入了一个哨兵,他的作用:在数组0索引处存放我们需要查询的数据,在循环的过程中不用判断数组是否越界,因为当i==0时,循环一定会跳出。哨兵主要作用就是可以避免我们进行不必要的判断,借助这个思想在其他算法中也可以引入哨兵。
/**
* Sequential search. Attention: It is assume that the index 0 is NOT used.
* @param paraKey
* @return
*/
public String sequentialSearch(int paraKey) {
data[0].key = paraKey;
int i;
for (i = length - 1; data[i].key != paraKey; i--) {
;
}//Of for i
return data[i].content;
}
折半查找
一般的顺序查找是无序的,而折半查找 他主要适用的是有序顺序查找,
思路:(假设顺序有升序排列)
1.key值和中间位置的关键字比较,若相等查找成功
- 若不相等,key值大于中间元素关键字,则查找元素可能在后半部分;若key值小于中间元素,则查找元素可能在前半部分。则缩小范围内查询
对于折半查找我让我联想的到二叉排序树,二叉排序树的查找和二分查找很相似,但是二分查找他适用于有序的顺序表,而二叉排序树是树,有顺序存储和链式存储,之前在day22中给出的一种存储是压缩存储,所以二叉排序树的查找与二分查找的实现,还是要结合具体的存储结构
/**
* Binary search. Attention: It is assume that keys are sorted in ascending order.
* @param paraKey
* @return
*/
public String binarySearch(int paraKey) {
int tempLeft = 0;
int tempRight = length - 1;
int tempMiddle = (tempLeft + tempRight) / 2;
while (tempLeft <= tempRight) {
tempMiddle = (tempLeft + tempRight) / 2;
if (data[tempMiddle].key == paraKey) {
return data[tempMiddle].content;
} else if (data[tempMiddle].key <= paraKey) {
tempLeft = tempMiddle + 1;
} else {
tempRight = tempMiddle - 1;
}
}
return "null";
}
简化语句
当for循环中不超过一条语句时,可以省略花括号。还有if语句,while循环这些,若只有一条循环语句则可以省略大括号。
总结
今天学习的是查找中两种比较容易的算法即顺序查找和折半查找,两种算法各有优劣,就单从查找速度比较,顺序查找不及二分查找,但是顺序查找对数据有序性无要求,对存储方法也无要求所以他适应性更广一些