算法第二章上机实验报告

                        算法第一次上机实验报告

                            潘俊霖 丁丽丽

7-1二分查找:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。输入格式:

输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。

输出格式:

输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入样例:

4

1 2 3 4

1

输出样例:

0

2

解题思路:这题最重要的是二分查找。一开始我们使用书上的算法,使用递归函数,出现了几个问题。主函数问题不太大,主要出现在递归函数中。一开始在n-1的地方出了问题,是当查找的数不存在的时候,跳不出递归算法。就改用其他函数,用迭代,这样子就更为地简单。其次的关键点就是计数。在循环语句的外面的加入count++.

import java.util.Scanner;

 

import static java.util.Arrays.sort;

 

public class Main {

    static int count = 0;

public static int biSearch(int[] a,int left,int right,int x)

{

    while(left <= right)

    {

        int mid = (left + right) / 2;

        if(a[mid] == x)

            {

                count++;

                return mid;

            }

         if(a[mid] < x)

     {

         count++;

         left = mid + 1;

     }

         if(a[mid] > x)

         {

             count++;

             right = mid - 1;

         }

    }

    return -1;

}

    

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

int n = input.nextInt();

int[] a = new int[n];

for(int i = 0; i < n; i++)

a[i] = input.nextInt();

int x = input.nextInt();

System.out.println(biSearch(a,0,n - 1,x));

        System.out.print(count);

}

}

7-2 改写二分搜索算法

a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

输入格式:

输入有两行:

第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

输入样例:

在这里给出一组输入。例如:

6 5

2 4 6 8 10 12

输出样例:

在这里给出相应的输出。例如:

1 2

解题思路:首先这题中的二分搜素可以沿用第一题打的代码。这题需要分情况。当这个数的时候能够在数组中找到时,与不能再数组中找到时。更需要注意的是当不存在的情况。题目需要的是有特定的顺序,当不存在的时候,题中要求的是当小于所求得数的最大元素位置和大于所求得数的最小元素位置,就是相邻位置。其中我们出现了一个问题数组超出范围,问题出在于下表范围错了,定义了n=10,在运行过程中却用到了11.

import java.util.Scanner;

 

import static java.util.Arrays.sort;

 

public class Main{

 

public static void main(String[] args) {

    int max = 0;

Scanner input = new Scanner(System.in);

int n = input.nextInt();

int x = input.nextInt();

int[] a = new int[n];

for(int i = 0; i < n; i++)

a[i] = input.nextInt();

int left = 0; int right= n-1;

while(left <= right)

    {

        int mid = (left + right) / 2;

        if(a[mid] == x)

            {

                System.out.println(mid + " " + mid);

                break;

            }

        if(a[mid] < x)

     {

         left = mid + 1;

     }

        if(a[mid] > x)

         {

             right = mid - 1;

         }

}

for(int i = 1 ; i < n ;i ++)

{

    if(a[i]!=x)

    {

        if(x < a[i] && x > a[i-1])

        {

            max = i;

            System.out.print((max-1) + " " + max);

        }

    }

}

if(x < a[0])

System.out.print(-1 + " " + 0);

if(x > a[n-1])

    System.out.print(n-1 + " " + n);

}

}

7-3 两个有序序列的中位数

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第(N+1)/2⌋个数(A​0​​为第1个数)。

输入格式:

输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的并集序列的中位数。

输入样例1:

5

1 3 5 7 9

2 3 4 5 6

输出样例1:

4

输入样例2:

6

-100 -10 1 1 1 1

-50 0 2 3 4 5

输出样例2:

1

解题思路:

posted @ 2019-09-23 22:05  噢神  阅读(290)  评论(0编辑  收藏  举报