算法第二章上机实验报告

1、实践题目

7-1 二分查找 (20 分)

输入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

2、问题描述

本道题是让我们输入非降序排列的整数,也就是说是排好序的了,然后输入我们要查找的数字,如果找到了,就输出所找的那个数在数组中的位置并输出比较的次数;如果没有找到的话,就输出-1还有比较的次数。

3、算法描述

使用二分法查找,每查找一次,问题规模减小为原来的一般,即将输入的序列存在一个数组里,假设要查找的数字为x,那么就是让x与a[n/2]比较。如果两者相等的话,那么x就找到了,算法结束。若是不相等的话,则根据x是大于a[n/2]还是小于a[n/2]决定是要在哪一部分里继续寻找。若x>a[n/2],则在数组的右半部分继续寻找;若x<a[n/2],则在数组的左半部分继续寻找。

代码如下:

#include <iostream>

using namespace std;

int BinarySearch(int a[],int x,int n){

int left = 0;

int right =n-1;

int count =0;

while(left <= right){

int middle = (left + right)/2;

count++;

if(x== a[middle]){

cout<<middle<<endl;

cout<<count;

return middle;

}

if(x>a[middle]){

left =middle + 1;

}

else {

right = middle -1;

}

}

cout<<"-1"<<endl;

cout<<count;

return -1;

}

int main(){

int n;

cin>>n;

int *a=new int[n];

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

cin>>a[i];

}

int x;

cin>>x;

BinarySearch(a,x,n);

return 0;

}

4、算法时间及空间复杂度分析(要有分析过程)

对于n个元素:

第一次二分:n/2
第二次二分:n/2^2
......
m次二分:n/(2^m)
2^m=n;

故时间复杂度为:log2n 
空间复杂度:因为各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。

5、心得体会(对本次实践收获及疑惑进行总结)
这次的二分查找算法实践,加深了我对二分法的理解。因为书本上有二分法查找的相关内容,我们没出现大问题。问题是出现在数组的定义上。我们一起找,没找到,最后上网查了一下才知道原来是我们数组定义的时候出了错!真的是有认真思考过才会印象深刻,因为我们在检查的过程中一遍又一遍的看我们写的代码,所以现在是比较熟悉,在被第一道题目困住,最后解决之后,第二道题目很快就做出来了。

原文地址:https://www.cnblogs.com/lincanji/p/9784633.html

时间: 2024-10-13 14:32:32

算法第二章上机实验报告的相关文章

09.19算法第二章上机实践报告

算法第二章上机实践报告 https://edu.cnblogs.com/campus/gdwywm/se1803/homework/7608 1.实践题目 7-3 两个有序序列的中位数 https://pintia.cn/problem-sets/1173827583729741824/problems/1173827629514764290 2.问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A ?0 ?? ,A ?1 ?? ,?,A ?N−1 ?

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践

算法第二章上机实践报告

题目 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. 实践题目 7-3 两个有序序列的中位数 2. 问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A?0??,A?1??,?,A?N?1??的中位数指A?(N?1)/2??的值,即第?(N+1)/2?个数(A?0??为第1个数). Input 在一行中输出两个输入序列的并集序列的中位数. Sample 输入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 输出

第二章上机实验报告

1.实践题目:7-1 2.问题描述:使用二分查找算法在n个非降序排列的整数中查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 3.算法描述:将n个元素分成个数大致相同的两半,取a[mid]与x比较.如果x=a[mid],则找到x,算法终止:如果x<a[mid],则只在数组a的左半部继续查找x,如果x>a[mid],则只在a的右半部继续搜索x.同时,在while语句里加一个b统计比较次数. 4.代码如下: 1 #include<iostream> 2

二分查找真的那么简单吗?——算法第二章上机实践报告

一.        实践题目 改写二分搜索算法 (20 分) 题目来源:<计算机算法设计与分析>,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在

《算法设计与分析》--算法第二章上机实践报告

开门见山,直接上题目. 7-2 改写二分搜索算法 (20 分) 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在数组中时,i和j相同. 提示:若x小于全部数

算法第三章上机实验报告

1.实践题目 7-2 最大子段和 2.问题描述 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 3.算法描述 首先将数据保存到一个数组内,然后建立一个循环来遍历这些数组,定义一个sum来保存和,定义一个max来保存最大值,对于每次遍历的结果x,如果sum为负,则将sum的值更改为x,并与max做对比,若比max大则将sum的值

算法第四章上机实验报告

题目:删数问题 问题描述:输入一个正整数a和一个正整数k(k≤n ),在n位正整数a中去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新 的正整数. 算法描述:从前往后进行比较,删掉升序的最后那个数,若一直保持升序,则删掉最后一位数,重复k次,删掉k个数 时间复杂度:该算法主要进行了k次的for循环,每次循环的时间复杂度是o(n),故其时间复杂度为o(n) 空间复杂度:该算法不需要额外的数组或变量来存放数据,故其空间复杂度为o(1) 心得体会:在做题的时候还要再细心一点,特别对于一些小细节