先比较数组的A[0]元素,若不相等接下来比较A[1],A[2],A[4],A[8]…,若找到一个区间A[2n-1]<x<A[2n],再对这个区间进行折半查找操作。总的时间为O(logn)。

若查找过程中A[i]中的i>n,则抛出异常

 package org.xiu68.ch02.ex2;

 import java.util.Random;
import java.util.Scanner; public class Ex2_16 {
public static final int ARR_MAX=1000000;
//public static final int MIN=10000;
public static void main(String[] args) {
//无穷数组,前n个元素为整数且已排好序,n未知,剩下为无穷大,输入整数x,找到元素等于x的
//位置(如果存在) //随机生成一个整数介于0~1000000之间作为数组中整数的长度,数组的长度为1000000。 Random r=new Random();
//int intLength=r.nextInt(ARR_MAX)%(ARR_MAX-MIN+1)+MIN;
int intLength=r.nextInt(ARR_MAX);
//构造一个数组,前n个元素为整数,剩下的为无穷大
int[] arr=new int[ARR_MAX];
for(int i=0;i<intLength;i++)
arr[i]=r.nextInt(ARR_MAX); for(int i=intLength;i<arr.length;i++)
arr[i]=Integer.MAX_VALUE; //对整数部分进行排序
quitSort(arr, 0, intLength); //输入一个整数
while(true){
Scanner sc=new Scanner(System.in);
System.out.println("输入一个整数:");
int x=sc.nextInt();
int result=search(arr,x,intLength);
if(result==-1)
System.out.println("不存在该值");
else
System.out.println("位置为:"+result); }
} //查找,确定一个范围,然后进行折半查找
public static int search(int[] r,int k,int intLength){
if(r[0]==k)
return 0;
else{
int t=r[1];
int i=1; while(t<k){
try{
i=i*2;
t=r[i];
}catch(ArrayIndexOutOfBoundsException e){ //数组A[i]满足i>n
System.out.println("数组越界");
return -1;
} }
return biSearch(r, i/2, i, k);
} } //快速排序划分算法
public static int partition(int[] r,int i,int j){
int temp=r[i];
while(i<j){
while(i<j && r[j]>=temp) //从j向前找比temp小的值
j--; if(i<j)
r[i++]=r[j]; //将j指向的值移到i的位置,i往后移一个位置 while(i<j && r[i]<temp) //从i向后找比temp大的值
i++; if(i<j)
r[j--]=r[i];
} r[i]=temp;
return i;
}
//快速排序算法
public static void quitSort(int[] r, int i,int j){
if(i<j){
int middle=partition(r, i, j);
quitSort(r, i, middle-1);
quitSort(r, middle+1, j);
}
} //折半查找算法
public static int biSearch(int[] r,int start,int end,int k){
if(start>end)
return -1;
else{
int mid=(start+end)/2;
if(r[mid]==k)
return mid;
else
if(r[mid]<k)
return biSearch(r,mid+1,end,k);
else
return biSearch(r,start,mid-1,k);
}
}
}

Ex 2_16 给定一个无穷数组..._第二次作业的更多相关文章

  1. Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业

    将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是 ...

  2. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  3. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  4. (016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)

    给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; Tr ...

  5. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  6. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  7. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  8. Java -- 给定一个int数组,拼接出最大数值

    public class ZhiJieTiaoDong { /* 给定一个数组:组合成最大数值 */ public String szpj(int[] args){ if(null == args | ...

  9. Ex 2_14 去掉数组中所有重复的元素..._第二次作业

    首先利用归并排序算法对数组进行排序,时间复杂度为O(nlogn),接着再利用时间复杂度为O(n) 的去重复算法去掉数组中的重复元素.总的时间复杂度为O(nlogn). (这题应该用分支算法解决)以下为 ...

随机推荐

  1. 自学python 5.

    1.tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "na ...

  2. 细说shiro之自定义filter

    写在前面 我们知道,shiro框架在Java Web应用中使用时,本质上是通过filter方式集成的. 也就是说,它是遵循过滤器链规则的:filter的执行顺序与在web.xml中定义的顺序一致,如下 ...

  3. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  4. MySQL触发器实现表数据同步

    其中old表示tab2(被动触发),new表示tab1(主动触发,外部应用程序在此表里执行insert语句) 1.插入:在一个表里添加一条记录,另一个表也添加一条记录DROP TABLE IF EXI ...

  5. mysql日期时间函数(常用的)

    mysql> SELECT NOW();  #返回(打印)当前日期和时间+---------------------+| NOW() |+---------------------+| 2017 ...

  6. 第20月第18天 小码哥swift

    1. 9月12日第一次更新 第二篇玩转[斗鱼直播APP]系列之界面分析 第三篇玩转[斗鱼直播APP]系列之项目部署 第四篇玩转[斗鱼直播APP]系列之获取APP图片资源 第五篇玩转[斗鱼直播APP]系 ...

  7. [国家集训队] Crash 的文明世界

    不错的树形$ DP$的题 可为什么我自带大常数啊$ cry$ 链接:here 题意:给定一棵$ n$个节点的树,边权为$ 1$,对于每个点$ x$求$ \sum\limits_{i=1}^n dist ...

  8. Spring Cloud学习资料

    博客 1.跟我学Spring Cloud 2.周立|Spring Cloud 3.Spring Cloud基础教程(强烈推荐) 4.Spring Cloud系列文章 5.forezp|史上最简单的 S ...

  9. React多行文本溢出处理(仅针对纯文本)

    最多显示4行,第四行末尾显示“...”

  10. MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)

    (一)数学函数 abs(x)              返回x的绝对值 bin(x)               返回x的二进制(oct返回八进制,hex返回十六进制) ceiling(x)      ...