當前位置:首頁 » 操作系統 » 折半查找演算法java

折半查找演算法java

發布時間: 2022-05-19 12:23:44

java一個折半查找的程序

這個是我剛寫,在給出代碼之前,我先聲明一下,至於你說的時間復雜度對我來說,是天書,我不懂

我只知道用循環的時候,誰用的次數少,能找出東西,誰就快!

這個是網路到的你所問的折半復雜度:O(log2n),倘若你真是大神著迷這個,你不妨看看演算法導論!

對於目前我來說,我就只認一個理,誰快而且能找的准誰就好用!

下面我用折半查找,和普通查找同時查找一個數字的時候用的次數對比,一目瞭然!

說實話,我也是初學者,而且對於數組這塊,排序,我甚是著迷,感覺這些原創大腦真的厲害...非常佩服!

閑話少說,上代碼:聲明下這個我個人原創for二分查找呵呵:

publicclassBinarySearch
{
publicstaticvoidmain(String[]args)
{
System.out.println(" ==========折半查找演算法========== ");

int[]arr={11,25,36,44,46,51,60,61,62,63,75,79,88};

System.out.println("目標索引位置:"+init(arr,62)+" ");
System.out.println("目標索引位置:"+init1(arr,62)+" ");

}
//折半查找!
privatestaticintinit(int[]arr,inta)
{
inttem=-1,n=0;
for(intt=0,w=arr.length-1,z=(w+t)/2;t<=w;)
{
n++;
if(a>arr[z])
t=z+1;
elseif(a<arr[z])
w=z-1;
elseif(a==arr[z])
{
tem=z;
break;
}
else
break;
z=(w+t)/2;
}
System.out.println("二分查找耗時n="+n+"次");
returntem;
}

//普通查找!
privatestaticintinit1(int[]arr,inta)
{
inttem=-1,n=0;
for(inti=0;i<arr.length;i++)
{
n++;
if(a==arr[i])
{
tem=i;
break;
}
}
System.out.println("普通查找耗時n="+n+"次");
returntem;
}
}

這里有個博客專門對演算法解析:還算比較通俗易懂的,你可以參考看看:

http://blog.csdn.net/firefly_2002/article/details/8008987

⑵ 用java實現,通過鍵盤輸入一個數,在排序後的數組中,採用折半查找法查找該數在數組中的 位置。

import java.util.Scanner;

public class Test {
static int bsearch( int[] a, int v ) {
int l, r;
l = 0; r = a.length-1;
while ( l <= r ) {
int m = (l+r)/2;
if ( a[m] == v ) return m; else
if ( a[m] > v ) r = m-1; else
if ( a[m] < v ) l = m+1;
}
return -1;
}

public static void main( String[] args ) {
int[] a = { 1,3,5,7,9 };
Scanner sc = new Scanner(System.in);
System.out.println("請輸入您要找的值:");
int num = sc.nextInt();
System.out.println( "找到 " + num + " 在數組的位置是:" + bsearch( a, num ) );
}
}

⑶ 怎樣使用java在排好序的序列中用折半查找的方法查找data的位置啊求解~

設置 min = 0 , max = list.size m = (min + max )/2
while(min<=max)
if(list[m] <data) max=m ;m= (min + max )/2
else if (list[m] >data) min = m ;m= (min + max )/2
else m 就是你要找的位置了
大概就是這個意思吧
折半查找就是找到中間點,和data比較大小,然後縮短范圍,依次遞歸,找到data

⑷ java數據結構---折半查找的遞歸演算法,望高手指點!

package souce;

public class Search {

public static boolean binarySearch(int[] a,int x,int left,int right){//二分查找的主方法
if(x==a[left]||x==a[right])return true; //找到,返回真
if(right-left<2)return false; //可找元素小於3,由上一步說明沒有,返回假
int mid = (left+right)/2; //否則:二分
if(x==a[mid])return true; //中間元素OK,返回OK
else{ //否則
if(x>a[mid])return binarySearch(a,x,mid+1,right);//大於中間元素找右半部分
else return binarySearch(a,x,left,mid-1); //小於中間元素找左半部分
}
}

public static final int[] sort(int[] a){ //int數組 的 排序方法
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if(a[i]<a[j]){
swap(a,i,j);
}
}

}
return a;
}

private static void swap(int[] a, int i, int j) { //數組元素交換子函數
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

public static void print(int[] a){ //列印函數
System.out.println();
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
if(i!=a.length-1)System.out.print(",");
}
System.out.println();
}

public static void main(String[] args) { //測試方法
int[] a = {90, 12, 21, 32, 51, 78, 87, 98};
print(sort(a));
System.out.println(binarySearch(sort(a), 40, 0, a.length-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中的二分查找法

1、演算法概念。

二分查找演算法也稱為折半搜索、二分搜索,是一種在有序數組中查找某一特定元素的搜索演算法。請注意這種演算法是建立在有序數組基礎上的。

2、演算法思想。

①搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;

②如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。

③如果在某一步驟數組為空,則代表找不到。

這種搜索演算法每一次比較都使搜索范圍縮小一半。

3、實現思路。

①找出位於數組中間的值,並存放在一個變數中(為了下面的說明,變數暫時命名為temp);

②需要找到的key和temp進行比較;

③如果key值大於temp,則把數組中間位置作為下一次計算的起點;重復① ②。

④如果key值小於temp,則把數組中間位置作為下一次計算的終點;重復① ② ③。

⑤如果key值等於temp,則返回數組下標,完成查找。

4、實現代碼。

/**
*description:二分查找。
*@paramarray需要查找的有序數組
*@paramfrom起始下標
*@paramto終止下標
*@paramkey需要查找的關鍵字
*@return
*/
publicstatic<EextendsComparable<E>>intbinarySearch(E[]array,intfrom,intto,Ekey)throwsException{
if(from<0||to<0){
("paramsfrom&lengthmustlargerthan0.");
}
if(from<=to){
intmiddle=(from>>>1)+(to>>>1);//右移即除2
Etemp=array[middle];
if(temp.compareTo(key)>0){
to=middle-1;
}elseif(temp.compareTo(key)<0){
from=middle+1;
}else{
returnmiddle;
}
}
returnbinarySearch(array,from,to,key);
}

⑻ 關於java中根據折半查找法創建二叉樹

public static int binarySearch(int[] table, int value) //折半查找演算法,數組元素已按升序排列
{ //若查找成功返回元素下標,否則返回-1
if (table!=null)
{
int low=0, high=table.length-1; //查找范圍的下界和上界
while (low<=high) //邊界有效
{
int mid = (low+high)/2; //中間位置,當前比較元素位置
System.out.print(table[mid]+"? ");
if (table[mid]==value)
return mid; //查找成功
else
if (table[mid]>value) //給定值小
high = mid-1; //查找范圍縮小到前半段
else
low = mid+1; //查找范圍縮小到後半段
}
}
return -1; //查找不成功
}

⑼ 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寫一個完整的折半查找法!!!

import java.util.Scanner;

public class b {

/**
*
* *折半查找法,又稱十分法查找 查找的對象是一個按序排好的數組
*/

public static void main(String[] args) {

int[] initVals = { 9, 12, 37, 53, 67, 71, 89, 122, 290, 435, 555, 888,
1104, 1111, 2222, 3333, 21343, 43256, 56778300 };

for (int i = 0; i < initVals.length; i++)

{

System.out.print(initVals[i] + "、");

}

Scanner cin = new Scanner(System.in);

while (cin.hasNext())

{
int targetVal = cin.nextInt();

b bq = new b();

int postion = bq.query(initVals, targetVal);

if (postion == -1)
System.out.println("沒有找到");

else
System.out.println("要查找的數字在數組中的第 " + (postion + 1) + "個位置");
}
}

/*
*
* 29 29 * @param values 要找的數組對象
*
* 30 30 * @param targetVal 要找的目標數字
*
* 31 31 * @return -1 沒有找到,返回-1
*
* 32 32
*/

public int query(int[] initVals, int targetVal) {

int lowBound = 0;
int upBound = initVals.length - 1;

// 相當於一個指針,指向下一個要比的數字

int nowPostion;

while (true) {

// 指向現在所有數字的中間,沒有整除時向下取整,如7/2=3

nowPostion = (lowBound + upBound) / 2;

// 如果現在這個數字就是了,返回現在的編號

if (initVals[nowPostion] == targetVal) {

return nowPostion;

}

// 如果上界小於下界時,說明已經找完全部了,返回-1表示沒有找到

else if (lowBound > upBound) {

return -1;

}

// 還可以繼續找
else {

// 當前指針的數比targetVal要小,那麼要往小的方向繼續找

if (initVals[nowPostion] < targetVal) {

lowBound = nowPostion + 1;

}

// 當前指針的數比targetVal要大,那麼要往大的方向繼續找

else {

upBound = nowPostion - 1;
}

}
}

}

}

熱點內容
安卓如何修改cpu 發布:2025-05-16 21:58:20 瀏覽:364
pythonainb 發布:2025-05-16 21:45:56 瀏覽:855
淘汰伺服器可以做家用電腦嗎 發布:2025-05-16 21:41:31 瀏覽:842
遊程編碼c語言 發布:2025-05-16 21:26:51 瀏覽:586
帝來哪個配置值得購買 發布:2025-05-16 21:12:29 瀏覽:462
什麼是nodejs前端伺服器 發布:2025-05-16 21:12:17 瀏覽:405
編譯選項立即綁定未定義符號 發布:2025-05-16 20:55:13 瀏覽:907
linuxmysql慢日誌 發布:2025-05-16 20:47:58 瀏覽:272
村兩委有哪些配置 發布:2025-05-16 20:34:47 瀏覽:294
我的世界有什麼伺服器好玩的 發布:2025-05-16 20:28:57 瀏覽:484