【Java实现查找算法】1.顺序查找2.二分查找 3.哈希查找 4.BFPRT,嘿嘿嘿

java查找算法(五)--BFPRT查找算法 /* 思想与随机排序一样,随机排序中吧第一个数当做 pivot ,BFPST 排序中用中位数的中位数作为 pivot ,使划分效果更好 * 找到中位数的位置后,与 a[low] 交换,这样就转化为随机排序 * 比较a[low]=pivot 值得位置与 k 的大小,确定继续在左右还是右边递归查找 * 最坏情况下时间复杂度为 O(n) ( 1)将输入数组的个元素划分为 n/5 组,每组5 个元素, 阅读详情

1. 顺序查找(Linear Search):

public static int linearSearch(int[] arr, int target) {
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == target) {
            return i;
        }
    }
    return -1; // 返回-1表示未找到
}

2. 二分查找(Binary Search):

注意:二分查找要求数组是已排序的。

public static int binarySearch(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;
        }

        if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1; // 返回-1表示未找到
}

3. 哈希查找(Hashing):

哈希查找通常涉及到一个哈希表(HashMap)或哈希集(HashSet),但以下是一个简单的哈希函数示例,它直接映射到数组索引(注意这只是一个示例,实际哈希函数会更复杂)。

import java.util.HashMap;
import java.util.Map;

public class HashSearch {
    public static int hashFunction(int key) {
        // 简单的哈希函数,仅用于示例
        return key % 10; // 假设数组长度为10
    }

    public static int hashSearch(int[] arr, int target) {
        Map<Integer, Integer> hashMap = new HashMap<>();

        // 假设数组已经通过哈希函数映射到哈希表中
        // 在实际应用中,你需要在插入元素时构建这个哈希表

        // 假设的哈希表构建过程(此处省略)

        // 查找
        Integer index = hashMap.get(target);
        if (index != null && index < arr.length && arr[index] == target) {
            return index; // 返回目标在数组中的索引
        }
        return -1; // 返回-1表示未找到
    }

    // 注意:上述hashSearch方法中的hashMap构建过程在实际应用中需要在插入元素时完成。
}

4. BFPRT(快速选择算法):

快速选择算法是快速排序算法的一个变种,用于在未排序的数组中找到第k小的元素。

public static int quickSelect(int[] arr, int left, int right, int k) {
    if (left == right) {
        return arr[left];
    }

    int pivotIndex = partition(arr, left, right);

    if (k == pivotIndex) {
        return arr[k];
    } else if (k < pivotIndex) {
        return quickSelect(arr, left, pivotIndex - 1, k);
    } else {
        return quickSelect(arr, pivotIndex + 1, right, k);
    }
}

private static int partition(int[] arr, int left, int right) {
    int pivot = arr[right];
    int i = left - 1;

    for (int j = left; j < right; j++) {
        if (arr[j] <= pivot) {
            i++;
            swap(arr, i, j);
        }
    }
    swap(arr, i + 1, right);
    return i + 1;
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

```java
public static void main(String[] args) {  
    int[] arr = {3, 2, 1, 5, 6, 4};  
    int k = 2; // 查找第2小的元素  
    // 注意:数组索引是从0开始的,所以第2小的元素实际上是索引为1的元素(如果排序后)
    int result = quickSelect(arr, 0, arr.length - 1, k - 1); // 减1是因为我们要的是排序后的第k个位置
    System.out.println("The " + k + "th smallest element is: " + result);
}

由于数组的索引是从0开始的,因此当我们说“第2小的元素”时,实际上我们是在寻找排序后数组中索引为1的元素。所以,在调用quickSelect函数时,我们将k减去了1。

现在,整个quickSelect算法和main方法的实现都已经完成了,你可以运行这个程序来查看结果。在这个例子中,它将输出:

The 2th smallest element is: 2
【搞定算法】常见算法题分类总览 博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。 完善中...... 由于本人平时刷题比较零散,有时候找起来不是很方便,所以统一将题目记录于此。主要的题目来源自:剑指 Offer、LeetCode、左神算法、面试、笔试、面经等等。下面按照分类记录: 说明(个人见解): 一、标注说明 ... 阅读详情

相关推荐

快速排序与快速选择算法详解与优化

快速排序是一种基于分治策略的高效排序算法,平均时间复杂度为O(nlogn),其核心在于通过分区(partition)操作将数组分为小于和大于基准值(pivot)的两部分。快速选择算法则是在此基础上衍生出的选择算法,能够在O(n)时间复杂度内找到第k大元素。这两种算法都体现了分治思想和递归实现的核心编程范式,是算法工程师必须掌握的基础技能。在实际工程中,通过三数取中法选择pivot、尾递归优化等技术可以显著提升性能。这些算法在大数据处理、实时系统等场景有广泛应用,如电商TopK商品统计、金融风控异常检测等。理

weixin_34060741的博客 295

Java常用查找算法

本文总结Java常用查找算法顺序查找算法,线性查找算法,二分查找算法,分块查找算法和哈希查找算法。 1、顺序查找算法 /*** * 顺序查找算法按数组的顺序从前往后一直比较,直到找到目标值返回。 * 参考链接:http://developer.51cto.com/art/201406/443115.htm * http://blog.csdn.net/qq284565035/artic...

HelloWorld搬运工 1437

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2740

BFPRT

BFPRT 题目:在一个无序数组中找到一个第K小的数 一:背景介绍 原文链接: https://segmentfault.com/a/1190000008322873 在一堆数中求其前 k 大或前 k 小的问题,简称 TOP-K 问题。而目前解决 TOP-K 问题最有效的算法即是 BFPRT 算法,又称为中位数的中位数算法,该算法由 Blum、Floyd、Pratt、Rivest、Tarjan...

GoSantiago的博客 350

海思Hi3519AV100 sensor移植实战:IMX586驱动调试与硬件验证全流程

本文详细解析了在海思Hi3519AV100平台上移植索尼IMX586传感器的全流程实战。内容涵盖从硬件I2C通信验证、驱动代码移植与修改,到内核配置、时钟设定,以及使用示波器进行硬件信号深度验证和ISP图像调优等关键步骤,为开发者提供了一套清晰、可复现的sensor移植与调试方法。

weixin_29168393的博客 395

联想拯救者恢复出厂设置全攻略

通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。

mmoo_python的博客 3252

[牛客算法系列] BFPRT算法

BFPRT算法O(n)解决第k小的数 我们通常会简单地进行一个快速排序后,得到第k个位置上的数字即可。 我们都知道的是快速排序是个不稳定的排序,它的排序过程简单的理解主要是两个概念Partion,pivot(基准数) 一趟快速排序的过程如下 先从序列中选取一个数作为基准数 将比这个数大的数全部放到它的右边,把小于或者等于它的数全部放到它的左边 一趟快速排序也叫做Partion...

Britesun的博客 1822

【WILEY】从Revision到Online:一次投稿的完整状态演进与关键节点实战解析

本文详细解析了从Revision到Online发表的完整投稿流程,包括修改稿准备、回复信撰写、状态跟踪等关键节点。特别针对Wiley期刊,提供了实用的操作技巧和常见问题解决方案,帮助作者高效完成论文修改与发表。

weixin_29219189的博客 361

算法之七大查找算法简介

写在前面:传说查找算法有七大算法,本文将介绍简单的介绍七大查找算法,之后的文章,将对每个算法进行深入的解析,并配上leetCode上面的训练题。 七大查找算法:顺序查找,二分查找,插值查找,斐波拉契查找,树表查找,分块查找,哈希查找。 一,查找分类 静态查找:查找过程中,查找的表中,没有插入或者删除的动作。 动态查找:查找过程中,查找的表中,有插入或者删除的动作。 无序查找:查找的表是无...

weixin_35873355的博客 919

OmniBox2.0.X版本 一站式影视订阅与多端播放平台文档

OmniBox 是一站式影视订阅与多端播放平台:你可以用 JS 或 Python 按 OmniBox 规范自建爬虫源,在后台把多个爬虫源自由组合成订阅,然后在网页、手机、电视等全平台的客户端里使用。只要客户端支持 TVBox、猫源、UZ、Emby 等协议,即可无缝对接。同时支持电视直播源、六大平台直播间和网盘源视频在线观看,通过 Docker 一键部署。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1919

MIKE21 教程 3.2 随空间变化的网格文件制作(.dfsu文件制作) 曼宁值网格文件制作

上一节讲解了如何制作时间序列文件。本节讲解如何制作仅随空间变化的文件。 目录 1 数据准备 1.1 基于地形设置 1.2 基于地形水深设置: 2 数据导入 3 数据导出

Hello Word 3941

java 返回第k小的数_BFPRT算法O(n)解决第k小的数

第k小算法我们通常会简单地进行一个快速排序后,得到第k个位置上的数字即可。我们都知道的是快速排序是个不稳定的排序,它的排序过程简单的理解主要是两个概念Partion,pivot(基准数)一趟快速排序的过程如下先从序列中选取一个数作为基准数将比这个数大的数全部放到它的右边,把小于或者等于它的数全部放到它的左边一趟快速排序也叫做Partion,即将序列划分为两部分,一部分比基准数小,另一部分比基准数大...

weixin_34487308的博客 464

微信公众号网页H5跳转小程序实战指南(开放标签wx-open-launch-weapp)微信H5跳转小程序、wx-open-launch-weapp、小程序跳转按钮、微信开放标签、H5打开小程序

跳转小程序(wx-open-launch-weapp)唤起App显示支付按钮等等……而我们这次要用的,就是跳转小程序的标签。场景是否支持服务号网页✅ 支持小程序静态网页托管✅ 支持订阅号❌ 不支持微信外部浏览器❌ 不支持这个“开放标签”功能其实很强大,除了跳转小程序,还有唤起APP、跳支付、调用客服等能力。但可惜资料零散,很多坑等着你亲自踩一遍。这篇文章我整理的流程基本涵盖了从“能不能跳”到“怎么跳”的完整路径,希望你能像我一样省下几个小时的踩坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1163

BFPRT 算法

今天我写这个算法的时候发现了很多运行的时候总是有很多问题,先挂上代码: [code="java"] package org.iaiai.suanfa; /** * * * Title: BFPRT.java * * * E-Mail: 176291935@qq.com * * * QQ: 176291935 * * * ...

{丸の子} 139

Windows10环境下激活虚拟环境报错【source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称】

在使用Django创建Web程序前,需要创建一个虚拟的工作环境,在使用【source ll_env/bin/activate】命令激活虚拟环境时报错:source : 无法将“source”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。所在位置 行:1 字符: 2。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一周极客热文:程序员必须知道的10大基础实用算法及其讲解

   程序员必须知道的10大基础实用算法及其讲解,包括: 快速排序算法; 堆排序算法(Heapsort):是指利用堆这种数据结构所设计的一种排序算法; 归并排序(Merge sort,台湾译作:合并排序):是建立在归并操作上的一种有效的排序算法; 二分查找(线性查找算法):是一种在有序数组中查找某一特定元素的搜索算法; BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k...

博客 2249

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2

2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2,1) (2,2),也就是任意两个数都可以,而且自己和自己也算数字对,数字对怎么排序?第一维数据从小到大;第一维数据一样的,第二维数组也从小到大,所以上面的数值对排序的结果为:(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3)。给定一个数组arr,和整数k,返回第k小的数

福大大架构师每日一题 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N)。 输入: nums = [1,1,1

力扣上测试了主流语言的运行速度和内存占用。运行速度上,rust最快,go最慢,但跟java差不多。内存占用上,rust最少,go比rust稍微多一点,java最多。2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。输入: nums = [1,1,1,2,2,3], k = 2。词频统计,bfprt算法。你可以按 任意顺序 返回答案。代码用rust编写。要求时间复杂度O(N)。输出: [1,2]。

福大大架构师每日一题 2万+

排序算法,看这一篇就够了,含动图+Java实现

0、排序算法说明 0.1排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度:一个算法执行所...

编程者说的博客专栏 577

【大总结1】数据结构与传统算法总结_floyd算法求最短路径

c语言知识体系算法体系参考课上笔记1(复习c、课程概述)课上笔记2(基本概念、时空复杂度)时空复杂度浅析P/NP/NPC引入:算法优化提高篇基础动态规划摔手机:借一道水题打开思路Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。

2401_84617477的博客 1113

简单_快速选择算法(RANDOMIZED-SELECT)

[code="java"] package sunfa.midNum; import java.util.Arrays; import java.util.Comparator; import java.util.Random; /** * * 参考:--------------------------------------------- * http://blo...

443

数据结构与传统算法知识总结

转:https://blog.csdn.net/hebtu666/article/details/83011422 涉及语言: py3:注重算法本身的知识 c/c++:实现基础数据结构和算法 java:实现较复杂数据结构 一、概述 c语言知识体系 算法体系参考 课上笔记1(复习c、课程概述) ...

欧特GO 927

TopK问题

针对海量数据的top k问题,这里实现了一种时间复杂度为O(Nlogk)的有效算法:初始时一次性从文件中读取k个数据,并建立一个有k个数的最大堆,代表目前选出的最小的k个数。然后从文件中一个一个的读取剩余数据,如果读取的数据比堆顶元素小,则把堆顶元素替换成当前的数,然后从堆顶向下重新进行堆调整;否则不进行任何操作,继续读取下一个数据。直到文件中的所有数据读取完毕,堆中的k个数就是海量数据中最小的k个数(如果是找最大的k个数,则使用最小堆)

Artisan_w 488

排序算法java 简书_手撕算法---常见排序算法java实现

冒泡排序是一种比较并交换排序方式。两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。private void sort(int[] arr){for (int i = 0; i < arr.length; i++) {for (int j = i+1; j < arr.length; j++) {if (arr[i] > arr[j]){swap(arr,i,j ...

weixin_42176612的博客 210
上一篇: 【Java实现排序算法】1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.归并排序6.快速排序 7.堆排序
下一篇: 【用Java实现字符串匹配算法】1.暴力匹配(Brute Force Matching) 2.KMP算法(Knuth-Morris-Pratt Algorithm) 3.Boyer-Moore算法
代码无疆
博客等级 码龄3年 4万+粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值