在平常的軟體開發過程中,我們經常都會遇到需要在陣列或集合中查詢某個指定元素的情況。通常情況下,我們會使用按照自然順序的方式來查詢陣列中的是否存在指定的元素。例如:
/*** 從陣列中順序查詢是否存在指定的元素,如果存在則返回該元素的索引,否則返回-1
** @param array 指定所查詢的陣列
* @param search 待查詢的元素
* @return
*/public static final int search(int array, int search)
}return -1;
}不過,作為程式設計師更應該掌握能夠提高查詢效率的相關演算法,比如——二分查詢(binary search)。二分查詢是程式設計技術領域一種非常著名也比較簡單的演算法,它可以使得查詢元素的效率得到幾何量級的提高。不過,值得注意的是,二分查詢的使用前提是:所查詢的排列必須是乙個有序(從大到小或從小到大)的排列。
二分查詢演算法,簡單點說,就是先將乙個有序排列最中間的元素x取出來與查詢的元素進行比較,從而確定查詢的元素是在x的左側還是右側(或者是x本身),從而縮小查詢的區間範圍。然後再繼續取出縮小範圍後的有序排列中最中間的元素與查詢的元素進行比較,再次確定查詢的元素是在其左側還是右側,通過多次這樣的迴圈篩選,不斷縮小查詢的區間範圍,最後確定待查詢元素的位置。
如上所述,二分查詢演算法是一種比較簡單的演算法。不過,遺憾的是,美國著名的程式設計技術專家喬恩·本特利(jon bentley)在2023年的經典名著《程式設計珠璣》(programming pearls)中提到他的乙個調查結果:居然有90%左右的程式設計師無法在2小時內使用自己喜歡的程式語言正確編寫出二分查詢的**。因此,我們不得不在這裡老生常談似的,再次回顧一下二分查詢演算法**的實現:
/*** 使用二分查詢演算法在有序陣列中查詢指定的元素,如果找到則返回對應的陣列索引,否則返回-1
* @param array 待查詢的有序陣列(注意,是有序陣列!)
* @param search 需要查詢的元素
* @return
*/public static final int binarysearch(int array, int search) else if (array[mid] > search) else
}return -1;
}// 程式主方法
public static void main(string args) ; //必須是事先已經排序好的陣列
system.out.println(binarysearch(array, 65)); // 輸出:5
}上述**也是網路上其他介紹二分查詢演算法的文章中給出的完整**實現,可是這樣就結束了嗎?no,當然不是,這還不是完整的二分查詢實現**。眾所周知,二分查詢是針對乙個有序排列而設計的陣列查詢演算法,既然是有序排列,不僅從小到大的排列是有序排列,從大到小的排列也是有序排列。但是,上述**卻只能實現對從小到大的有序排列的二分查詢,如果是從大到小的有序排列,它就無能為力了。因此,我們需要針對從大到小的有序排列的情況來完善上述**:
/*** 使用二分查詢演算法在有序陣列中查詢指定的元素,如果找到則返回對應的陣列索引,否則返回-1
** @param array 待查詢的有序陣列(注意,是有序陣列!)
* @param search 需要查詢的元素
* @return
*/public static final int binarysearch(int array, int search) else
} else if (array[mid] > search) else
} else
}return -1;
}// 程式主方法
public static void main(string args) ;
system.out.println(binarysearch(array, 65)); // 輸出:1
}
二分查詢入門詳解
在平常的軟體開發過程中,我們經常都會遇到需要在陣列或集合中查詢某個指定元素的情況。通常情況下,我們會使用按照自然順序的方式來查詢陣列中的是否存在指定的元素。例如 從陣列中順序查詢是否存在指定的元素,如果存在則返回該元素的索引,否則返回 1 param array 指定所查詢的陣列 param sea...
二分查詢詳解
演算法概括 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將...
二分查詢詳解
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。假設我們比較的有序數列有三個數,我們比較乙個元素的值和陣列中間位置的元素的值進行比較,如果比中間的元素大,則在有序陣列的後半部分進行查詢 如果中間...