1. 程式人生 > >JAVA實驗二:編碼實現一個類對輸入陣列的數從小到大排序同時使用二分法查詢某一個數(遞迴和非遞迴)

JAVA實驗二:編碼實現一個類對輸入陣列的數從小到大排序同時使用二分法查詢某一個數(遞迴和非遞迴)

編碼實現一個類

(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,注意寫法