我正在使用递归编写二进制搜索算法,但我只是不知道如何开始。这是我到目前为止的内容:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class BinarySearch implements ActionListener
{

    public static void main(String[] args)
    {

        new BinarySearch();
    }


    private JSpinner searchSpinner;
    private JButton searchButton;
    private JList   searchList;


    Integer[] myNumbers = {1, 3, 5, 6, 8, 9, 10, 12, 14, 15};


    public BinarySearch()
    {
        JFrame myFrame = new JFrame();       // create the JFrame window
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JPanel mainPanel = (JPanel)myFrame.getContentPane();
        mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.Y_AXIS));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));


        searchSpinner = new JSpinner(new SpinnerNumberModel(5,0,99,1));


        searchButton = new JButton("Search");
        searchButton.addActionListener(this);
        searchButton.setAlignmentX(Component.CENTER_ALIGNMENT);


        searchList = new JList(myNumbers);
        searchList.setFixedCellWidth(50);
        searchList.setVisibleRowCount(myNumbers.length);


        JLabel label = new JLabel("Target Value");
        label.setAlignmentX(Component.CENTER_ALIGNMENT);


        mainPanel.add(label);
        mainPanel.add(searchSpinner);
        mainPanel.add(Box.createRigidArea(new Dimension(0,5)));
        mainPanel.add(searchButton);
        mainPanel.add(Box.createRigidArea(new Dimension(0,5)));
        mainPanel.add(searchList);


        myFrame.pack();
        myFrame.setVisible(true);
    }


    public void actionPerformed(ActionEvent event)
    {
        Object control = event.getSource();
        if (control == searchButton)
        {

            searchList.clearSelection();


            int targetValue = (Integer)searchSpinner.getValue();


            int index = binarySearch(myNumbers,targetValue,0,myNumbers.length-1);


            if (index >= 0)
            {

                searchList.setSelectedIndex(index);
            }
            else
            {

                JOptionPane.showMessageDialog(null, "Number " + targetValue + " not found!");
            }
        }
    }


    public int binarySearch(Integer[] targetArray, int targetValue, int lowIndex, int highIndex)
    {

    }
}


在“ public int binarcySearch()”部分的底部,我被卡住了。我想我需要一些带有返回值的if语句,也许还有其他一些东西,但是我不知道到底是什么。我知道我该怎么做,但不知道该怎么做。这是本书中的一些提示,我不确定该如何实现:


如果您的lowIndex输入大于highindex,则返回-1,因为您已经完成了数组搜索并且找不到目标值。
使用二进制搜索讨论中描述的公式来计算整数midIndex值:
midIndex = lowIndex +(highIndex-lowIndex)/ 2。
在midIndex处检查目标数组的值。如果它与您的targetValue相匹配,则说明您已完成,因此请返回midIndex作为最终结果!
如果找不到您的targetValue,则需要递归调用binarySearch(),修改lowIndex和highIndex参数以删除数组中不包含目标的部分。

如果中间值太大,则在递归函数调用中使用现有的lowIndex和等于midIndex -1的highIndex。
如果中间值太低,则在递归函数调用中使用等于midIndex +1的lowIndex和现有的highIndex
您的递归binarySearch()调用将返回目标值的索引,如果未找到则返回-1,因此您可以直接从父binarySearch()代码返回该结果。



请记住,我是一个非常初级的初学者,婴儿程序员,而我正在学习的DIY课很烂,无法说明问题。因此,请简单明了。谢谢。

最佳答案

注意:回答是因为我没有评论代表

真令人沮丧。好吧,您所复制的书中的提示是有关如何实现binarySearch()方法的规范。我建议学习如何解决问题的方法是逐步执行每个提示语句,使用到目前为止所学的各种流控制语句,并查看结果是否通过测试。

实际上,这就是今天有多少专业开发人员在工作。我们编写测试用例来描述我们想要完成的结果,然后再实际编写代码本身,知道它会失败。测试通过我们就完成了。

由于指示不清楚,Google对您的Google Java二进制搜索有何帮助?对计算机科学而言,诸如二进制搜索之类的基础知识有许多示例和解释,它们可能对学生更好。

This可能会有所帮助。

10-08 17:37