题目:给定数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}。采用二分搜索算法完成下述任务:
- 查找是否有元素30,若有返回元素在数组中的位置;如没有返回无此元素。
- 查找是否有元素20,若有返回元素在数组中的位置;如没有返回无此元素。
- 当待搜索元素x=10不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。
二分搜索算法、快速排序-算法分析与设计实验3(有完整详细的解答!!!欢迎下载!!!)-Java文档类资源-CSDN下载一次大学算法分析与设计的实验报告作业!!!题目内容设计二分搜索算法、顺序搜索算法、快速排序及性能分更多下载资源、学习资料请访问CSDN下载频道.
https://download.csdn.net/download/weixin_51620201/85005219
比较赶时间的朋友可以点击上面的链接哦!下载观看,有完整的解题思路和代码,例题更多!!!
目录
一、基本思路
二分搜索算法的思想很简单,先理解一下题目,我们需要在数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}中查找到一个元素,找到了就返回该元素在数组中的位置(即下标),找不到就返回无此元素,好啦,我们要做的事情就一目了然啦!!
很关键的一个点,不知你有没有发现,题目给出的数组是一个已经按递增排序好的数组,对于这么一个数组,如果利用顺序搜索算法查找的话,在最坏情况下,就需要比较n次(n为元素的个数),在最好情况下,只需要比较一次,那么平均时间复杂度为O(n)。但如果用二分搜索算法的话,每一次比较后,数组的长度就会减半,在最坏的情况下时间复杂度为O(logn),在最好的情况下,同样是只需要比较一次,平均时间复杂度为O(logn)。
所以这题用二分搜索算法是一个比较好的选择!!!
基本思想:把数组分成划分成相对平均的两半,令middle=(left+right)/2,初始化left=0,right=n-1.把待查找元素x与a[middle]对比,若x==a[middle],则查找完毕!
若x>a[middle],则目标元素可能在右边的数组,数组长度减半,令left=middle+1,再进行x与a[middle]的比较,直到递归查找结束!
若x<a[middle],则目标元素可能在左边的数组,数组长度减半,令right=middle-1,再进行x与a[middle]的比较,直到递归查找结束!
有理论知识的支持,自然我们的代码就不难写啦!!!
二、实现代码
二分搜索算法:
public static int binarySearch(int[] a,int x) //二分折半搜素算法 { int n=a.length; int left=0; int right=n-1; while(left<=right) { int middle=(left+right)/2; //middle为中间元素 if(x==a[middle]) return middle; //查找成功,返回结果 if(x>a[middle]) left=middle+1; //要查找的x在数组的右边 else right=middle-1; //要查找的x在数组的左边 } return -1; //找不到x,返回-1 }
你看,是不是很简单???
在第三小题中,我配合了顺序搜索算法来进行元素的查找,为了性能的更优!!!
public static int sequenceSort(int[] a,int x) //顺序搜索算法 { int i; for(i=0;i<a.length;i++) if(x>a[i] && x<a[i+1]) //查找比10小的最大元素下标 return i; return i; }
三、详细的解题
第一题:
查找是否有元素30,若有返回元素在数组中的位置;如没有返回无此元素。
运行代码:
第二题:
查找是否有元素20,若有返回元素在数组中的位置;如没有返回无此元素。
第三题:
当待搜索元素x=10不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。
四、完整代码:
import java.util.Scanner;public class Search //搜素算法{ public static int binarySearch(int[] a,int x) //二分折半搜素算法 { int n=a.length; int left=0; int right=n-1; while(left<=right) { int middle=(left+right)/2; //middle为中间元素 if(x==a[middle]) return middle; //查找成功,返回结果 if(x>a[middle]) left=middle+1; //要查找的x在数组的右边 else right=middle-1; //要查找的x在数组的左边 } return -1; //找不到x,返回-1 } public static int sequenceSort(int[] a,int x) //顺序搜索算法 { int i; for(i=0;i<a.length;i++) if(x>a[i] && x<a[i+1]) //查找比10小的最大元素下标 return i; return i; } public static void main(String[] args) { int a[] = {1, 8, 12, 15, 16, 21, 30, 35, 39}; System.out.println("请输入一个你想查找的整型元素:"); Scanner reader=new Scanner(System.in); //键盘输入想要查找的元素 int x=reader.nextInt(); int i=binarySearch(a, x); if(i!=-1) { System.out.println("元素"+x+"已经找到!"); System.out.println(x+"在数组中的下标为"+binarySearch(a,30)); } else { System.out.println("没有"+x+"此元素!"); if(x==10) //由于原数组是已经排好序的,可以利用顺序搜索查找 { System.out.println("小于元素"+x+"的最大元素的下标为"+sequenceSort(a,x)); System.out.println("大于元素"+x+"的最小元素的下标为"+(sequenceSort(a,x)+1)); } } }}
创作不易,谢谢支持!!三连(点赞、关注、收藏),必回!!!