二分法java,二分法java递归

本文目录一览:

用二分法查找(折半查找)java

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找优缺点

优点是比较次数少,查找速度快,平均性能好;

其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:查找序列是顺序结构,有序。

过程

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

利用循环的方式实现二分法查找

public class BinarySearch {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println(“产生的随机数组为: ” + Arrays.toString(array));

System.out.println(“要进行查找的值: “);

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim);

System.out.println(“查找的值的索引位置: ” + index);

}

/**     * 生成一个随机数组     *

* @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找  —循环的方式实现     *

* @param array 要查找的数组     * @param aim 要查找的值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim) {

// 数组最小索引值        int left = 0;

// 数组最大索引值        int right = array.length – 1;

int mid;

while (left = right) {

mid = (left + right) / 2;

// 若查找数值比中间值小,则以整个查找范围的前半部分作为新的查找范围            if (aim array[mid]) {

right = mid – 1;

// 若查找数值比中间值大,则以整个查找范围的后半部分作为新的查找范围            } else if (aim array[mid]) {

left = mid + 1;

// 若查找数据与中间元素值正好相等,则放回中间元素值的索引   } else {

return mid;

}

}

return -1;

}}

运行结果演示:

由以上运行结果我们得知,如果要查找的数据在数组中存在,则输出该数据在数组中的索引;如果不存在则输出 -1 ,也就是打印 -1 则该数在数组中不存在,反之则存在。

四、利用递归的方式实现二分法查找

public class BinarySearch2 {

public static void main(String[] args) {

// 生成一个随机数组        int[] array = suiji();

// 对随机数组排序        Arrays.sort(array);

System.out.println(“产生的随机数组为: ” + Arrays.toString(array));

System.out.println(“要进行查找的值: “);

Scanner input = new Scanner(System.in);

// 进行查找的目标值        int aim = input.nextInt();

// 使用二分法查找        int index = binarySearch(array, aim, 0, array.length – 1);

System.out.println(“查找的值的索引位置: ” + index);

}

/**     * 生成一个随机数组     *     * @return 返回值,返回一个随机数组     */

private static int[] suiji() {

// Random.nextInt(n)+m  返回m到m+n-1之间的随机数        int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循环遍历为数组赋值        for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/**     * 二分法查找 —递归的方式     *     * @param array 要查找的数组     * @param aim   要查找的值     * @param left  左边最小值     * @param right 右边最大值     * @return 返回值,成功返回索引,失败返回-1     */

private static int binarySearch(int[] array, int aim, int left, int right) {

if (aim array[left] || aim array[right]) {

return -1;

}

// 找中间值        int mid = (left + right) / 2;

if (array[mid] == aim) {

return mid;

} else if (array[mid] aim) {

//如果中间值大于要找的值则从左边一半继续递归            return binarySearch(array, aim, left, mid – 1);

} else {

//如果中间值小于要找的值则从右边一半继续递归            return binarySearch(array, aim, mid + 1, array.length-1);

}

}}

运行结果演示:

总结:

递归相较于循环,代码比较简洁,但是时间和空间消耗比较大,效率低。在实际的学习与工作中,根据情况选择使用。通常我们如果使用循环实现代码只要不是太繁琐都选择循环的方式实现~

Java二分法

首先得告诉你,二分法的前提是必须是顺序方式存储,而且必须是排好序了的。比如要从100个数中查找某一个数,前提是这一百个数是排好序(这里假如从小到大)的,然后找到最中间的数,若最中间的数(这里是第50个)比你要找的这个数大那你只需要在1到49个数里找,然后再取最中间的数,再判断,如此往复下去,最多次数,你算算看,

java 二分法 排序

二分排序就是用先用二分查找法来查某一个元素,然后再用别的排序算法来进行排序。

package insert;

public class InsArrayApp {

public static void main(String[] args) {

int size = 100;

InsArray arr = new InsArray(size);

arr.insert(10);

arr.insert(9);

arr.insert(8);

arr.insert(7);

arr.insert(6);

arr.insert(10);

arr.insert(9);

arr.insert(8);

arr.insert(5);

arr.insert(4);

arr.insert(3);

arr.insert(2);

arr.insert(1);

arr.display();

// arr.insertSort();

// arr.display();

// System.out.println(arr.median());

// arr.noDups();

arr.noDups2();

arr.display();

}

}

class InsArray {

private int[] a;

private int nElems;

public InsArray(int size) {

a = new int[size];

nElems = 0;

}

public void insert(int value) {

a[nElems] = value;

nElems++;

}

public void display() {

for (int i = 0; i nElems; i++) {

System.out.print(a[i] + ” “);

}

System.out.println();

}

public void insertSort() {

int out, in;

int copy = 0;

int compare = 0;

/* for(out = 1;outnElems;out++){

int tmp = a[out];

in = out;

while(in0a[in-1]=tmp){

a[in] = a[in-1];

–in;

}

a[in] = tmp;

}*/

for(out = 1;outnElems;out++){

int tmp = a[out];

in = out;

while(in0){

if(a[in-1]=tmp){

a[in] = a[in-1];

–in;

++copy;

++compare;}

else{

break;

}

}

++compare;

a[in] = tmp;

}

System.out.println(“copy:” + copy + “compare:” + compare);

}

public int median(){

insertSort();

int m = nElems/2;

return a[m];

}

public void noDups(){

insertSort();

/*

InsArray tmp = new InsArray(nElems);

for(int i = 0;inElems;i++){

for(int j = i+1;jnElems;j++)

if(a[i] == a[j]){

a[j] = -1;

}

if(a[i]!=-1)

tmp.insert(a[i]);

}

*/

InsArray tmp = new InsArray(nElems);

int i;

for(int j = 0;jthis.nElems;j++){

/*if(tmp.nElems==tmp.find(this.a[j])) //binary find

tmp.insert(this.a[j]);

else

continue;*/

for( i = 0; i tmp.nElems; i++) { // for each element

if(tmp.a[i]==this.a[j]) // found searchKey?

break;

}

if(i==tmp.nElems) // no

tmp.insert(this.a[j]);

}

this.a = tmp.a;

this.nElems = tmp.nElems;

}

public int find(long searchKey) {

int lowerBound = 0;

int upperBound = nElems-1;

int curIn;

while(true) {

curIn = (lowerBound + upperBound)/2;

if(a[curIn]==searchKey)

return curIn;

else if(lowerBoundupperBound)

return nElems;

else {

if(a[curIn]searchKey)

upperBound = curIn-1;

else

lowerBound = curIn+1;

}

}

}

public void noDups2(){

insertSort();

for(int i = 0;inElems;i++){

for(int j = i+1;jnElems;j++)

if(a[i] == a[j]){

a[j] = -1;

}

}

display();

int index = 0;

for(int i=0;inElems;i++){

if(a[i]!=-1){

index++;

}else{

for(int j=index+1;jnElems;j++){

if(a[j]!=-1){

a[index] = a[j];

a[j]=-1;

index++;

break;

}

}

}

}

nElems = index;

}

}

上面的代码,是我以前敲的,有个find()方法是二分查找,然后再用插入排序去进行排序。

怎么计算java二分法查找的比较次数

您好,我来为您解答:

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。

基本思想:假设数据是按升序排序的,对于给定值

x,从序列的中间位置开始比较,如果当前位置值等于

x,则查找成功;若

x

小于当前位置值,则在数列的前半段中查找;若

x

大于当前位置值则在数列的后半段中继续查找,直到找到为止。

希望我的回答对你有帮助。

java二分法查找重复数字的下标?

package pers.ly.javase.algorithm;import java.util.Arrays;/**

* 二分法查找

* @author: Lu Yang

* @date: 2019-01-23 10:50:37

*

*/public class BinarySearch {

public static void main(String[] args) {

Integer[] arr = {10,50,30,40,10,80,90,70,60,40,100,10};

// 数组排序 – 二分法必要条件

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

System.out.println(binarySearch(arr,50));

}

/**

*

* @author: Lu Yang

* @date: 2019-01-23 11:44:01

* @param arr 数组

* @param value 数组元素值

* @return

*

*/

public static Integer binarySearch(Integer[] arr, Integer value) {

// 定义数组开始位置

Integer start = 0;

// 定义数组结束位置(arr.length是计算数组从1开始的总长度,arr.length-1计算数组从0开始的总长度)

Integer end = arr.length – 1;

// 开始位置 = 结束位置

while (start = end) {

// 定义数组的中心位置(开始位置+结束位置)/2

Integer mid = (start + end) / 2;

// 判断数组mid位置值(当前数据中间位置值)是否小于传过来的值

if (arr[mid] value)

// 如果小于传过来的值,数组开始位置则定义中间位置下标+1

start = mid + 1;

// 判断数组mid位置值(当前数据中间位置值)是否大于传过来的值

if (arr[mid] value)

// 如果大于传过来的值,数组结束位置则定义中间位置下标-1

end = mid – 1;

if (arr[mid] == value)

return mid;

}

return -1;

}}

二分法查找的java代码

public class ef {

public static void main(String[] args) {

int[] a = { 4, 8, 12, 44, 69, 71, 98, 132 ,133};

int m = ef.ef(a, 0, a.length, 71);

if(m!=-1){

System.out.println(a[m]+”=====”+m);

}

System.out.println(“不存在该数字”);

}

public static int ef(int[] a, int from, int to, int b) {

int midel = (from + to) / 2;

if ((to – from) = 1 b != a[midel]) {

return -1;

}

if (b a[midel]) {

return ef(a, midel, to, b);

} else if (b a[midel]) {

return ef(a, from, midel, b);

} else {

return midel;

}

}

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/239798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:18
下一篇 2024-12-12 12:18

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论