導航:首頁 > 編程語言 > 折半查找java

折半查找java

發布時間:2023-05-24 20:52:50

Ⅰ 白盒測試:用折半查找法在元素呈升序排列的數組中查找值為 key 的元素

動漫班上華鑫的作業吧……
/壞笑

Ⅱ 如何用java代碼實現在一個已排列好的數組中找出小於等於給定x的位數下標(用二分查找做)


importjava.util.Arrays;

importjava.util.Random;


publicclassTest{


publicint[]getRandom(intlen){

int[]nums=newint[len<=0?10:len];

Randomrandom=newRandom();

for(inti=0;i<nums.length;i++){

nums[i]=random.nextInt(100);

}

returnnums;

}


publicIntegergetIndex(int[]nums,intvalue,intstartIndex,intendIndex){

if(startIndex==endIndex){

returnstartIndex;

}

intindex=(startIndex+endIndex)/2;

if(nums[index]==value){

returnindex;

}elseif(startIndex+1==endIndex&&nums[endIndex]>value){

returnendIndex;

}elseif(nums[index]>value){

returngetIndex(nums,value,startIndex,index);

}else{

returngetIndex(nums,value,index,endIndex);

}


}


publicstaticvoidmain(String[]args){

Testtest=newTest();

intvalue=50;

intlen=10;

int[]nums=test.getRandom(len);

Arrays.sort(nums);

Integerindex=test.getIndex(nums,value,0,nums.length-1);

System.out.println(Arrays.toString(nums));

System.out.println(value);

System.out.println(index);

}


}

Ⅲ 用Java語言編寫對整型數組進行二分查找的程序。

public class BinarySearchDemo {

public static void main(String[] args) {
int[] a = new int[]{1,5,7,9,11,18,23,48,69};
int point = new BinarySearchDemo().binarySearch(a, 23);

if(point == -1)
System.out.println("在數組中未查找到數23");
else
System.out.println("數字23是數組中第 " + (point + 1) + " 位數");

}

/**
* 二分法查找一個整數在整型數組中的位置
*
* 演算法思路:首先得到數組a的最小值和最大值的下標,分別是:low和high,接著求出值位於數組中間那個數的下標middle
* 然後再將這個middle對應的數組中的數和待查找的數num進行比較,如果相等,則表示已查找到,如果num < a[middle]
* 則說明num位於a[low]和a[middle]之間,於是將a[middle - 1]設為較大值,繼續求出此時對應的a[middle],
* 再進行比較,其他情況可依次類推。一直到low=high,如果此時還沒有在數組a中查找到,則說明該數組a中沒有值num,返回-1
*
* @param a 給定的整型數組
* @param num 待查找的數 num
*
* @return 返回整數num在數組a中的位置下標,如果未查找到則返回-1
* */
public int binarySearch(int[] a,int num){
int low = 0;
int high = a.length - 1;

while(low <= high){
int middle = (low + high) / 2;
if(num == a[middle])
return middle;
else if(num < a[middle])
high = middle - 1;
else
low = middle + 1;
}

return -1;
}

}

程序基本上就是這樣了,其中注釋中有詳細的解釋說明

Ⅳ 用二分法查找(折半查找)java

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。

二分查找優缺點

優點是比較次數少,查找速度快,平均性能好;

其缺點是要求待查表為有序表,且插入刪除困難。

因此,折半備鏈查找方法適用於不經常變動而查找頻繁的有序列表。
使用條件:查找序列是順序結構,有序。


過程

首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

利用循環的方式實現二分法查找

public class BinarySearch {
public static void main(String[] args) {
// 生成一個隨機數組 int[] array = suiji();
// 對隨機數組排序 Arrays.sort(array);
System.out.println("產仿胡孫生的隨機數組為: " + Arrays.toString(array));

System.out.println("要進行查找的值: ");
Scanner input = new Scanner(System.in);
// 進行查找的目標值 int aim = input.nextInt();

// 使用二分法查找 int index = binarySearch(array, aim);
System.out.println("查找的值的索引位置: " + index);

}

/** * 生成一個隨機數組 *
* @return 返回值,返回一個隨機數組 */
private static int[] suiji() {
// random.nextInt(n)+m 返回m到m+n-1之間的隨機數 int n = new Random().nextInt(6) + 5;
int[] array = new int[n];
// 循環遍歷為數組賦值 for (int i = 0; i < array.length; i++) {
array[i] = new Random().nextInt(100);
}
return array;
}

/** * 二分法查找 ---循環的方式實現 *
* @param array 要查找的數組 * @param aim 要查找的值 * @return 返回值,成功返回索引,失敗返回-1 */
private static int binarySearch(int[] array, int aim) {
// 數組最小索引值 int left = 0;
// 數組最大索引值 int right = array.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
// 若查找數值比中間值小,則以整個查找范圍的前半部分作為新的查找范圍 if (aim < array[mid]) {
right = mid - 1;
// 若查找數值比中間值大,則以整個查找范圍的後半部分作為新的查找范圍 } else if (aim > array[mid]) {
left = mid + 1;
// 若查找數據與中間元素值正好相等,則放回中間元素值的索引 } else {
return mid;
}
}
return -1;
}}
運行結果演示:

總結:

遞歸相較於循環,代碼比較簡潔,但是時間和空間消耗比較大,效率低。在實際的學習與工作中,根據情況選擇使用。通常我們如果使用循環實現代碼只要不是太繁瑣都選擇循環的方式實現~

Ⅳ java程序,用折半查找法判斷一個從鍵盤輸入的數是否包含在該指定區間的數組元素中。

是不是這樣的。。。。作業棚或明天交,十分捉急
編寫一個鏈握伍java 應用程序,首先對一個數組指定區間內包含的元素進行排序,然後使用折半查找法判斷一個從鍵盤輸入的數是否包含在該指定區間的數組元素中。

參考使用的方法:

java.util.Arrays類中實現數組指定區間包含的元素排序的方法是:

void sort(double[] a, int fromIndex,int
toIndex)

java.util.Arrays類中實現在數組指定區間包含的元素中採用折皮差半查找演算法查找指定數據的方法是:

int binarySearch(double[] a,
int
fromIndex, int
toIndex,
double
key)

Ⅵ JAVA面試題:3道問答題!

1:堆棧都是內存的可用區域,但是 堆的速度慢容量大,棧的速度快容量小。一個64K的字元串,自然放在堆。棧的內存是很寶貴的。
2:介面和抽象類都是面向對象編程的特點,都是可繼承(實現)為明確的類。一般:所描述的事物(事件)屬於很抽象的,則先使用介面表達這個事物,然後使用抽象類實現劃分出各種分類事物。例如:List 介面下有抽象類:AbstractSequentialList<E> AbstractList<E>等,然後才有LinkedList ArrayList
3:如果這兩個重復的數字沒有說出其大小。並且數組是有序的,那就挨著比較2個相鄰的數。或者:
int i=0;
Set<Integer> set=new HashSet<Integer>();
for(;i<array.length;i++)
if(set.add(array[i])) break;

array[i];//就是了

Ⅶ java實現折半查找 循環結束的條件看不懂

二分法查找(折半查找)的時間復雜度是O(log2n)

即是最壞的情況比較次數是2為底2n的對數。也就數如果數組長度為2,最壞的情況比較2兩次謹擾;數組長度為16,最壞的情況比較5次;數組長度1204,最壞的情況是比較11次 就可以找到這個值或者確定找不到這個值。

你的代碼就是通大缺過判斷比較的次數來決定是否結束循環,當已比較(循環)次數大於最壞情況的次數還沒有結束(number != a[middle]),則說明數組中不存在這個值。不過這里是用的N/2來近似的判斷。

另一種更普遍的寫法

publicclassDemo{
publicstaticvoidmain(String[]args){

//你原來的代碼

System.out.println(Arrays.toString(a));
Scannerscanner=newScanner(System.in);
System.out.println("輸入整數,程序判斷該整數是否在數組中:");
intnumber=scanner.nextInt();

intindex=binary(a,number);
if(index==-1){
滾晌辯System.out.printf("%d不在數組中. ",number);
}else{
System.out.printf("%d在數組中,在數組中的位置下標是%d.",number,index);
}
}

privatestaticintbinary(int[]array,intvalue){
intstart=0;
intend=array.length-1;
while(start<=end){
intmiddle=(start+end)/2;
if(value==array[middle]){
returnmiddle;
}elseif(value>array[middle]){
start=middle+1;
}else{
end=middle-1;
}
}
return-1;
}
}

Ⅷ 用java寫二分搜索,要求數組是由用戶輸入,再輸入時,數組是無序的,要對數組進行從小到大的排序

二分查找又稱折半查找,它是一種效率較高的查找方法。
【二分查找要求】:1.必須採用順序存儲結構 2.必須按關鍵字大小有序排列。

/**
* 二分查找又稱折半查找,它是一種效率較高的查找方法。
【二分查找要求】:1.必須採用順序存儲結構 2.必須按關鍵字大小有序排列。
* @author Administrator
*
*/
public class BinarySearch {
public static void main(String[] args) {
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
System.out.println(binarySearch(src,3,0,src.length-1));
}

/**
* * 二分查找演算法 * *
*
* @param srcArray
* 有序數組 *
* @param des
* 查找元素 *
* @return des的數組下標,沒找到返回-1
*/
public static int binarySearch(int[] srcArray, int des){

int low = 0;
int high = srcArray.length-1;
while(low <= high) {
int middle = (low + high)/2;
if(des == srcArray[middle]) {
return middle;
}else if(des <srcArray[middle]) {
high = middle - 1;
}else {
low = middle + 1;
}
}
return -1;
}

/**
*二分查找特定整數在整型數組中的位置(遞歸)
*@paramdataset
*@paramdata
*@parambeginIndex
*@paramendIndex
*@returnindex
*/
public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
int midIndex = (beginIndex+endIndex)/2;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
return -1;
}
if(data <dataset[midIndex]){
return binarySearch(dataset,data,beginIndex,midIndex-1);
}else if(data>dataset[midIndex]){
return binarySearch(dataset,data,midIndex+1,endIndex);
}else {
return midIndex;
}
}

}

Ⅸ 46. 對110個元素的有序表用折半查找法進行查找時,求最大、最小比較次數

反復遞歸即可 最漏陸小當然是一碧氏次啦 最大就是不停的找
代碼如下
import java.util.Scanner;
public class HalfSearch {
static StringBuffer bf = new StringBuffer();
static int a = 0;
static int count = 0;
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要查找的數");
a = scanner.nextInt();
Search(0,110);
System.out.println(bf +" "+ count);
}
public static int Search(int min , int max) {
int half = (max+min)/2;
if (a <悔搜散 half) {
bf.append(half).append(";");
count++;
return Search(min,half);
}
else if (a > half){
bf.append(half).append(";");
count++;
return Search(half, max);
}
else {
bf.append(half);
count++;
return a;
}
}
}

閱讀全文

與折半查找java相關的資料

熱點內容
臟數據java 瀏覽:290
游戲解壓怎麼設置 瀏覽:782
會聲會影如何壓縮視頻 瀏覽:57
閱讀app小說怎麼轉換成txt 瀏覽:65
c語言編程數字變時間 瀏覽:655
迷你編程第五天初級寶箱怎麼弄 瀏覽:839
刺激體驗服如何更新伺服器 瀏覽:934
怎麼把照片做成新的文件夾 瀏覽:466
安卓手機沒有聲音均衡器怎麼辦 瀏覽:506
吃雞國際服為什麼會伺服器匆忙 瀏覽:248
微信中如何打開定位伺服器 瀏覽:203
java並發編程書籍 瀏覽:280
android601源碼 瀏覽:788
程序員離職了還能幹嘛 瀏覽:156
少林功法pdf 瀏覽:471
安卓80版本小游戲怎麼玩 瀏覽:632
奇書pdf 瀏覽:836
伺服器的管理口有什麼用 瀏覽:643
澳洲加密資產新政策 瀏覽:157
哈利波特連接伺服器失敗什麼意思 瀏覽:234