Ex 2_16 给定一个无穷数组..._第二次作业

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

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

  1 package org.xiu68.ch02.ex2;
  2
  3 import java.util.Random;
  4 import java.util.Scanner;
  5
  6 public class Ex2_16 {
  7     public static final int ARR_MAX=1000000;
  8     //public static final int MIN=10000;
  9     public static void main(String[] args) {
 10         //无穷数组,前n个元素为整数且已排好序,n未知,剩下为无穷大,输入整数x,找到元素等于x的
 11         //位置(如果存在)
 12
 13         //随机生成一个整数介于0~1000000之间作为数组中整数的长度,数组的长度为1000000。
 14
 15         Random r=new Random();
 16         //int intLength=r.nextInt(ARR_MAX)%(ARR_MAX-MIN+1)+MIN;
 17         int intLength=r.nextInt(ARR_MAX);
 18         //构造一个数组,前n个元素为整数,剩下的为无穷大
 19         int[] arr=new int[ARR_MAX];
 20         for(int i=0;i<intLength;i++)
 21             arr[i]=r.nextInt(ARR_MAX);
 22
 23         for(int i=intLength;i<arr.length;i++)
 24             arr[i]=Integer.MAX_VALUE;
 25
 26         //对整数部分进行排序
 27         quitSort(arr, 0, intLength);
 28
 29         //输入一个整数
 30         while(true){
 31         Scanner sc=new Scanner(System.in);
 32         System.out.println("输入一个整数:");
 33         int x=sc.nextInt();
 34         int result=search(arr,x,intLength);
 35         if(result==-1)
 36             System.out.println("不存在该值");
 37         else
 38             System.out.println("位置为:"+result);
 39
 40         }
 41     }
 42
 43
 44     //查找,确定一个范围,然后进行折半查找
 45     public static int search(int[] r,int k,int intLength){
 46         if(r[0]==k)
 47             return 0;
 48         else{
 49             int t=r[1];
 50             int i=1;
 51
 52             while(t<k){
 53                 try{
 54                 i=i*2;
 55                 t=r[i];
 56                 }catch(ArrayIndexOutOfBoundsException e){  //数组A[i]满足i>n
 57                     System.out.println("数组越界");
 58                     return -1;
 59                 }
 60
 61             }
 62             return biSearch(r, i/2, i, k);
 63         }
 64
 65
 66 }
 67
 68     //快速排序划分算法
 69     public static int partition(int[] r,int i,int j){
 70         int temp=r[i];
 71         while(i<j){
 72             while(i<j && r[j]>=temp)    //从j向前找比temp小的值
 73                 j--;
 74
 75             if(i<j)
 76                 r[i++]=r[j]; //将j指向的值移到i的位置,i往后移一个位置
 77
 78             while(i<j && r[i]<temp)        //从i向后找比temp大的值
 79                 i++;
 80
 81             if(i<j)
 82                 r[j--]=r[i];
 83         }
 84
 85         r[i]=temp;
 86         return i;
 87     }
 88     //快速排序算法
 89     public static void quitSort(int[] r, int i,int j){
 90         if(i<j){
 91             int middle=partition(r, i, j);
 92             quitSort(r, i, middle-1);
 93             quitSort(r, middle+1, j);
 94         }
 95     }
 96
 97     //折半查找算法
 98     public static int biSearch(int[] r,int start,int end,int k){
 99         if(start>end)
100             return -1;
101         else{
102             int mid=(start+end)/2;
103             if(r[mid]==k)
104                 return mid;
105             else
106                 if(r[mid]<k)
107                     return biSearch(r,mid+1,end,k);
108                 else
109                     return biSearch(r,start,mid-1,k);
110         }
111     }
112 }

时间: 2024-11-13 06:48:58

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

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

将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是这个元素,否则计算出A1和A2的主元素x1和x2: 若x1和x2都不存在,则A不存在主元素 若x1和x2有一个存在,则检查这个元素是否为A的主元素 若x1和x2都存在且不相等,则分别检查这个元素是否为A的主元素 若x1和x2都存在且相等,则这个元素就是A的,主元素 1 package org.xiu

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

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

给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树. 由于数组是递增有序的,每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; void newNode(TreeNode*& vNode, int vData) { vNode = new TreeNode; vNode->data = vData; vNode->leftChi

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

给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; void newNode(TreeNode*& vNode, int vData) { vNode = new TreeNode; vNode->data = vData; vNode->leftChi

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

题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1赋给max2,使原先最大的数成为第二大的数,再将这个数a赋给max1,如果这个数a比max1小但比max2大,则将这个数a赋值给max2,依次类推,直到数组中的数都比较完. c语言代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #defin

给定一个整数数组,奇数位于偶数前面

两个指针,一个指向最前,一个指向最后,依次进行交换 代码: #include<iostream> using namespace std; //使奇数位于偶数前面 void reSort(int *pData,int length){ if(NULL == pData || length <= 0) return ; int *pBegin = pData; int *pEnd = pData + length -1; while(pBegin < pEnd){ //奇数向前移动

1、给定一个字符数组,按照字典顺序进行从小到大的排序

/* * 1.给定一个字符数组,按照字典顺序进行从小到大的排序 * String[] arr = {"nba","abc","cba","zz","qq","haha"}; * 思路: * 1.对数组排序.可以用选择.冒泡 * 2.for嵌套和比较以及换位 * 3.问题:以前排的是整数,比较用的是运算字符 * * 字符串比较使用的是compareTo()函数 */public class

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

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

找出一个整形数组中第二大的数字

如何在时间复杂度为O(n)内找出数组中第二大的数字? 通过设置两个变量,一个保存最大值,一个保存第二大值,通过在找最大值的过程中,原来的最大值逐渐变为第二大值.一种实现代码如下(Java版): 1 /** 2 * 在时间复杂度为O(n)内找出数组的第二大的数字 3 * @author JiaJoa 4 * 5 */ 6 public class Algorithm_GetSecondMax { 7 8 public static void main(String[] args) { 9 // T