JAVA实验二:编码实现一个类对输入数组的数从小到大排序同时使用二分法查找某一个数(递归和非递归)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/83277813

编码实现一个类

(1)提供一个静态方法,可以将输入的一个int[]数组按照从小到大的顺序排列;
(2)提供静态方法,对排好序的数组使用折半(二分)查找(使用递归和非递归两种形式分别实现)查找某一个整数。

答案

import java.util.*;

public class Main 
{
/////////////////////提供一个静态方法,可以将输入的一个int[]数组按照从小到大的顺序排列;
	public static void sort(int []t)
	{
		for(int i=0;i<t.length-1;i++)
		{
			for(int j=i+1;j<t.length;j++)
			{
				if(t[i]>t[j])
				{
					int tt=t[i];
					t[i]=t[j];
					t[j]=tt;
				}
			}
		}
	}
/////////////提供静态方法,对排好序的数组使用折半(二分)查找(非递归)
	public static int search(int []t,int tt)
	{
		int l=0,r=t.length-1;
		while(l<=r)//别忘记等于号
		{
			int mid=(l+r)/2;
			if(t[mid]>tt)  r=mid-1;
			else if(t[mid]<tt)  l=mid+1;
			else if(t[mid]==tt)  return mid;
		}
		return -1;
	}
/////////////提供静态方法,对排好序的数组使用折半(二分)查找(递归)
	public static int Disearch(int []t,int low,int high,int o)
	{
		if(low>high) return -1;
		int mid=(low+high)/2;
		if(t[mid]>o) return Disearch(t,low,mid-1,o);//中间使用的时候,直接用t即可,不需要用[]t;
		else if(t[mid]<o) return Disearch(t,mid+1,high,o);
		else  return mid;
	}
	public static void main(String[] args) 
	{
		int []s=new int[5];
		Scanner scan=new Scanner(System.in);
		for(int i=0;i<5;i++)
		{
			int e=scan.nextInt();
			s[i]=e;
		}
		sort(s);
		for(int i=0;i<s.length;i++)
		{
			if(i==s.length-1) System.out.println(s[i]);
			else System.out.print(s[i]+" ");
		}
		if(search(s,5)!=-1)
			System.out.println("The position of the number is "+search(s,5));
		else System.out.println("Can not find the number!");
		if(Disearch(s,0,s.length,7)!=-1)
			System.out.println("The position of the number is "+Disearch(s,0,s.length,7));
		else System.out.println("Can not find the number!");
	}

}

注意:

一、排序问题

https://blog.csdn.net/fighting123678/article/details/79573973
选择排序和冒泡排序


二、二分法

1、基本思路

  • 两个数,一个l(指向一组数的队头,数值为0),一个r(指向一组数的队尾,数值为length-1)
  • 取l和r的中间数mid=(l+r)/2,如果要查找的数o比中间数大的话,那么就说明o位于整体的后半段,这样直接让l=mid+1即可
  • 取l和r的中间数mid=(l+r)/2,如果要查找的数o比中间数小的话,那么就说明o位于整体的前半段,这样直接让r=mid-1即可
  • 按照上面的思路,不断缩小查找的范围
  • 如果l>r的话,说明,直接不可能有o这个数,那么就返回-1;
  • 如果l<=r的话,并且找到在mid这个位置上的数与要查找的o相同,那么就可以返回这个数的地址

2、非递归的二分法

public static int search(int []t,int tt)
	{
		int l=0,r=t.length-1;
		while(l<=r)//别忘记等于号
		{
			int mid=(l+r)/2;
			if(t[mid]>tt)  r=mid-1;
			else if(t[mid]<tt)  l=mid+1;
			else if(t[mid]==tt)  return mid;
		}
		return -1;
	}

(1)形参因为是一个数组,所以写法是int []t;

(2)while中,别忘记等于号


3、递归二分法

public static int Disearch(int []t,int low,int high,int o)
	{
		if(low>high) return -1;
		int mid=(low+high)/2;
		if(t[mid]>o) return Disearch(t,low,mid-1,o);//中间使用的时候,直接用t即可,不需要用[]t;
		else if(t[mid]<o) return Disearch(t,mid+1,high,o);
		else  return mid;
	}

(1)形参因为是一个数组,所以写法是int []t;后来返回的时候,写法是t,注意写法

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/83277813