先比较数组的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. Char类型与Sting类型的数字字符转换时的不同点

    这是在一次编程时的bug里偶然发现的一个问题.在C#中,单引号默认是char类型字符,而双引号默认是string类型字符.对于char类型的数字字符,通过强制类型转换或者convert转换,转换成的整 ...

  2. VS Resharper正常代码显示红色处理

    点击重启VS即可.

  3. “<textarea>”内的文字对齐

    转载:https://blog.csdn.net/henryzhang2009/article/details/9283803 转: textarea会把开始标签到结束标签里的内容全部原样显示,包括空 ...

  4. chrome调试技巧和插件介绍

    14 个你可能不知道的 JavaScript 调试技巧 五种前端开发必备的调试技术 日志的艺术 吐血推荐珍藏的Chrome插件 吐血推荐珍藏的 Chrome 插件(二)

  5. 【mmall】IDEA插件jrebel

    破解方法 http://www.jianshu.com/p/87b11bad3d7f

  6. 比较python类的两个instance(对象) 是否相等

    http://www.yihaomen.com/article/python/281.htm 比较python类的两个instance(对象) 是否相等 作者:轻舞肥羊 日期:2012-10-25 字 ...

  7. tidb调研

    TiDB是新一代开源分布式 NewSQL 数据库,相比较于我们常见的数据库MySQL,TiDB具有水平伸缩.强一致性的分布式事务.基于 Raft 算法的多副本复制等特性.同时,TiDB兼容MySQL生 ...

  8. mysql 半同步复制~ 整体概述与改进

    一 简介:今天来聊聊增强半同步复制这一强悍的特性 二 原理解析 1 AFTER_COMMIT(5.6默认值) master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log ...

  9. delete 和 delete []的区别

    (1). 针对简单类型 使用new分配后的不管是数组还是非数组形式内存空间用两种方式均可 如:   int *a = new int[10];   delete a;   delete [] a;   ...

  10. 码云IntelliJ IDEA

    将项目从码云clone到IntelliJ IDEA https://blog.csdn.net/wust_lh/article/details/68068176 用IDEA上传本地项目到码云/Gith ...