public class BinarySearchDemo {
成都創(chuàng)新互聯(lián)公司是一家集策劃、設計、技術開發(fā)一體的專業(yè)的建站公司,技術團隊十多年來致力于為客戶提供企業(yè)網站定制,成都做手機網站。經過多年發(fā)展,公司技術團隊,先后服務了1000多家客戶,包括各類中小企業(yè)、上市公司、高校、政府。公司在過去十多年的資源積累,追求并一直堅持,為客戶打造更有價值的互聯(lián)網平臺。
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("在數(shù)組中未查找到數(shù)23");
else
System.out.println("數(shù)字23是數(shù)組中第 " + (point + 1) + " 位數(shù)");
}
/**
* 二分法查找一個整數(shù)在整型數(shù)組中的位置
*
* 算法思路:首先得到數(shù)組a的最小值和最大值的下標,分別是:low和high,接著求出值位于數(shù)組中間那個數(shù)的下標middle
* 然后再將這個middle對應的數(shù)組中的數(shù)和待查找的數(shù)num進行比較,如果相等,則表示已查找到,如果num a[middle]
* 則說明num位于a[low]和a[middle]之間,于是將a[middle - 1]設為較大值,繼續(xù)求出此時對應的a[middle],
* 再進行比較,其他情況可依次類推。一直到low=high,如果此時還沒有在數(shù)組a中查找到,則說明該數(shù)組a中沒有值num,返回-1
*
* @param a 給定的整型數(shù)組
* @param num 待查找的數(shù) num
*
* @return 返回整數(shù)num在數(shù)組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;
}
}
程序基本上就是這樣了,其中注釋中有詳細的解釋說明
以下代碼是關于對象的 二分查找 的例子,已經測試通過,執(zhí)行即可。
Student 是基本比較對象類
Dichotomy 是二分法執(zhí)行類
Test 是測試類
package com.dichotomy;
public class Student implements ComparableStudent {
private int id;
private String name;
private String idCard;
private String sex;
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
/**
* 排序控制
* @param o1 Student
* @param o2 Student
* @return int 返回 -1 向前移動, 1 向后移動, 0 不移動
* 這個方法需要自己進行調整,排序比較和二分查找時均使用此方法進行位置調整
* 比較時使用的key自己可以進行修改,不過要保證唯一性,否則查詢出來的值會不準確
*/
public int compareTo(Student o) {
//不同的執(zhí)行次序決定排序和查找次序不同,可以同下面的調換一下
if(this.getId() o.getId()){
return -1;
} else if(this.getId() == o.getId()){
;
} else {
return 1;
}
//不同的執(zhí)行次序決定排序和查找次序不同
int c = this.getIdCard().compareTo(o.getIdCard());
if(c != 0){
return c;
}
//不同的執(zhí)行次序決定排序和查找次序不同
int n = this.getName().compareTo(o.getName());
if(n != 0){
return n;
}
return 0;
}
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append(this.getId()).append("\t");
sb.append(this.getName()).append("\t");
sb.append(this.getIdCard()).append("\t");
sb.append(this.getMobile()).append("\t");
sb.append(this.getSex());
return sb.toString();
}
}
很明顯你不能把middle的賦值語句設在循環(huán)語句的外面,在二分查找算法中,在執(zhí)行一次查找后,middle是需要被重新賦值的,你所說的可以正確查找9只是一種巧合而已,因為第一次循環(huán)就能把9查出來。如果把那條語句放在你注釋的位置,下面的low=high永遠成立,肯定是死循環(huán)。
花了我將近一個小時的時間擺弄,你還不舍得給分
第一個類
/**************************************************************************
* 該類為啟動類,運行該類,將跳出輸入數(shù)組對話框,輸入的數(shù)字之間用逗號隔開,若輸入
* 的不是數(shù)字有可能出現(xiàn)異常,請自己處理。輸入的數(shù)字最大個數(shù)為100,也可以修改處理
* 更大個數(shù)的數(shù)組。
**************************************************************************/
package terry.test;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.EventListener;
import java.util.StringTokenizer;
public class InputData extends JFrame implements ActionListener
{
Container con=this.getContentPane();
JButton button1=new JButton("確定");
JButton button2=new JButton("取消");
JLabel label=new JLabel("請輸入數(shù)組:");
JTextField text=new JTextField("數(shù)字之間用逗號隔開");
Panel panel1=new Panel();
Panel panel2=new Panel();
@SuppressWarnings("deprecation")
public InputData()
{
super("輸入有序數(shù)據(jù)對話框");
con.setLayout(new GridLayout(2,1));
panel1.add(label);
panel1.add(text);
con.add(panel1);
button1.addActionListener(this);
panel2.add(button1);
button2.addActionListener(this);
panel2.add(button2);
con.add(panel2);
this.setSize(300,200);
this.show();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button1)
{
String dataString=text.getText();//截取寫入的數(shù)組,現(xiàn)在還是一個字符串
ordArray arr=new ordArray(100);//生成排序類的實例;
//以下為處理整個字符串,轉化為整型數(shù)組。
if(dataString!=null)
{
StringTokenizer s=new StringTokenizer(dataString,",");
while(s.hasMoreTokens())
{
int temp=0;
try
{
temp=(new Integer(s.nextToken())).intValue();
}catch(NumberFormatException ex)
{
JOptionPane.showMessageDialog(null, "在數(shù)組中,請輸入整數(shù)值!");
}
arr.insert(temp);
}
}
this.dispose();
new InputSearchApp(arr);
}
}
public static void main(String args[])
{
new InputData();
}
}
第二個類
/**************************************************
* InputData實例向該類的實例傳遞了orderArray參數(shù)變量*
* *
*/
package terry.test;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class InputSearchApp extends JFrame implements ActionListener{
Container con=this.getContentPane();
JButton button1=new JButton("確定");
JButton button2=new JButton("取消");
JLabel label=new JLabel("請輸入要查找的數(shù)值:");
JTextField text=new JTextField(10);
ordArray arr=null;
Panel panel1=new Panel();
Panel panel2=new Panel();
public InputSearchApp(ordArray testArray)
{
super("輸入有序數(shù)據(jù)對話框");
arr=testArray;
con.setLayout(new GridLayout(2,1));
panel1.add(label);
panel1.add(text);
con.add(panel1);
button1.addActionListener(this);
panel2.add(button1);
button2.addActionListener(this);
panel2.add(button2);
con.add(panel2);
this.setSize(200,200);
this.show();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button1)
{
String dataString=text.getText();
int searchKey= (new Integer(dataString)).intValue();
boolean success=arr.find(searchKey);
if(success)
{
this.dispose();
JOptionPane.showMessageDialog(null, ("查找到數(shù)據(jù)"+searchKey));
}
else
{
JOptionPane.showMessageDialog(null, ("沒有查找到數(shù)據(jù)"+searchKey));
}
}
}
}
第三個類2分查找類
package terry.test;
public class ordArray {
private int[]a;
private int nElems;
public ordArray(int max)
{
a=new int[max];
nElems=0;
}
public int size()
{
return nElems;
}
public boolean find(int searchKey)
{
return recFind(searchKey,0,nElems-1);
}
private boolean recFind(int searchKey,int lowerBound,int upperBound)
{
int curIn,theindex;
//boolean flag=false;
curIn=(lowerBound+upperBound)/2;
if(a[curIn]==searchKey)
theindex=curIn;
else if(lowerBoundupperBound)
theindex=nElems;
else
{
if(a[curIn]searchKey)
return recFind(searchKey,lowerBound,curIn-1);
else
return recFind(searchKey,curIn+1,upperBound);
}
if(theindex!=this.size())
return true;
else
return false;
}
public void insert(int value)
{
int j;
for(j=0;jnElems;j++)
if(a[j]value)
break;
for(int k=nElems;kj;k--)
a[k]=a[k-1];
a[j]=value;
nElems++;
}
}
//你那程序太難改了,每個方法都單職責啊
public?class?Test6?{
//二分查找
public?static?int?findPos(int[]?a,int?key)?{
int?start=0;
int?end=a.length-1;
int?temp=0;
while(startend){
int?mid=(start+end)/2;
if(keya[mid]){
start=mid+1;
temp=start;
}else?if(keya[mid]){
end=mid-1;
temp=end;
}else?{
return?mid;
}
}
return?temp;
}
public?static?void?main(String[]?args)?{
int[]array={1,4,6,7,10,11,23,78};
System.out.println(findPos(array,?0));
}
}
當前標題:java二分源代碼 java 二分
分享路徑:http://sd-ha.com/article46/doosdeg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計、用戶體驗、靜態(tài)網站、App開發(fā)、網站營銷、外貿建站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)