java顺序查找,查找--顺序查找

定义

顺序查找又称为线性查找,其算法思路是从数组中的第一个(或最后一个)记录开始,将数组中元素逐个与需要查找的关键字进行比对,若发现有相等的,则查找成功;若始终未能相等,则查找失败。

Java实现

// 定义接口

interface Searcher {

/**

* 从数组array中查找关键字key,如果存在则返回该关键字在数组中任意出现的位置(不局限于首次或者末次之类的),否则返回-1

*/

int search(int[] array, int key);

}

/**

* 顺序表查找,时间复杂度为O(n)

*/

class LinearSearcher implements Searcher {

@Override

public int search(int[] array, int key) {

int len = array.length;

for (int i = 0; i < len; i++) {

if (array[i] == key)

return i;

}

return -1;

}

}

LinearSearcher是标准的线性查找,这里有缺陷:在循环中每个循环实际上需要判断两次(一次是否相等,一次是否越界),如何改进呢?其实就是设置“哨兵”:

/**

* 优化的顺序表查找,时间复杂度O(n),但是比普通顺序表查找效率高

*/

class OptimizedLinearSearcher implements Searcher {

// 相比单纯的线性查找每次for循环需要判断两次,这里设置关键字值(即哨兵),可以让每次for循环只判断一次

// 当数据量比较大时,如果单纯从线性查找角度看,优化后的线性搜索优势明显

@Override

public int search(int[] array, int key) {

int len = array.length;

if (len == 0) // array为空,返回-1

return -1;

if (array[0] == key)

return 0;

array[0] = key; // array[0]不是key,那么将key赋值给array[0],将array[0]作为哨兵

// 这里"哨兵"也可以放在数组尾部

int i = len - 1;

while (array[i] != key) { // 每次循环少判断一个

i--;

}

if (i == 0) // 从数组尾部一直查找到array[0]才找到,说明不存在

return -1;

return i;

}

}

不论是线性查找还是改进后的线性查找,其时间复杂度都为O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值