day41

package datastructure.search;

/**
 * ******************************************
 *
 * @author Michelle Min MitchelleMin@163.com
 * @date 2021-07-01
 * ******************************************
 */
public class DataArray {
    /*
    An inner class for data nodes. The next book usually use an int value to
    represent the data. I would like to use a key-value pair instead.
     */
    class DataNode{
        /*
        The key.
         */
        int key;

        /*
        The data content.
         */
        String content;

        /**
         ********************************
         * The first constructor.
         ********************************
         */
        DataNode(int paraKey, String paraContent){
            key = paraKey;
            content = paraContent;
        }//of the second constructor

        /**
         ********************************
         * Overrides the method claimed in Object, the superclass of any class.
         ********************************
         */
        public String toString(){
            return "(" + key + ", " + content + ") ";
        }//of toString
    }//of class DataNode

    /*
    The data array.
     */
    DataNode[] data;

    /*
    The length of the data array.
     */
    int length;

    /**
     ********************************
     * The first constructor.
     *
     * @param paraKeyArray
     *                     The array of the keys.
     * @param paraContentArray
     *                     The array of the keys.
     ********************************
     */
    public DataArray(int[] paraKeyArray, String[] paraContentArray){
        length = paraKeyArray.length;
        data = new DataNode[length];

        for (int i = 0; i < length; i++) {
            data[i] = new DataNode(paraKeyArray[i], paraContentArray[i]);
        }//of for i
    }//of the first constructor

    /**
     ********************************
     *Overrides the method claimed in Object, the superclass of any class.
     ********************************
     */
    public String toString(){
        String resultString = "I an a data array with" + length + "items.\r\n";
        for (int i = 0; i < length; i++) {
            resultString += data[i] + " ";
        }//of for i

        return resultString;
    }//of toString

    /**
     ********************************
     * Sequential search. Attention: It is assume that the index 0 is NOT used.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     ********************************
     */
    public String sequentialSearch(int paraKey){
        data[0].key = paraKey;

        int i;
        //Note that we do not judge i >= 0 since data[0].key = paraKey.
        //In this way the runtime is saved about 1/2.
        for (i = length - 1; data[i].key != paraKey ; i--) {
            ;
        }//of for i
            return data[i].content;
    }//of sequentialSearch

    /**
     ********************************
     *Test the method.
     ********************************
     */
    public static void sequentialSearchTest(){
        int[] tempUnsortedKeys = {-1, 5, 3, 6, 10, 7, 1, 9};
        String[] tempContents = {"null", "if", "then", "else", "switch", "case", "for", "while"};
        DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);

        System.out.println(tempDataArray);

        System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));
        System.out.println("Search result of 5 is: " + tempDataArray.sequentialSearch(5));
        System.out.println("Search result of 4 is: " + tempDataArray.sequentialSearch(4));
    }//of sequentialSearchTest

    /**
     ********************************
     * Binary search. Attention: It is assume that keys are sorted in ascending
     * order.
     *
     * @param paraKey The given key.
     * @return The content of the key.
     ********************************
     */
    public String binarySearch(int paraKey){
        int tempLeft = 0;
        int tempRight = length - 1;
        int tempMiddle = (tempLeft + tempRight)/2;

        while (tempLeft <= tempRight){
            tempMiddle = (tempLeft + tempRight)/2;
            if (data[tempMiddle].key == paraKey) {
                return data[tempMiddle].content;
            }else if (data[tempMiddle].key <= paraKey){
                tempLeft = tempMiddle + 1;
            }else{
                tempRight = tempMiddle - 1;
            }
        }//of while

        //Not found.
        return "null";
    }//of binarySearch

    /**
     ********************************
     *Test the method.
     ********************************
     */
    public static void binarySearchTest(){
        int[] tempSortedKeys = {1, 3, 5, 6, 7, 9, 10};
        String[] tempContents = {"if", "then", "else", "swith", "case", "for", "while"};
        DataArray tempDataArray = new DataArray(tempSortedKeys, tempContents);

        System.out.println(tempDataArray);

        System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));
        System.out.println("Search result of 5 is: " + tempDataArray.sequentialSearch(5));
        System.out.println("Search result of 4 is: " + tempDataArray.sequentialSearch(4));
    }//of binarySearchTest

    /**
     ********************************
     *The entrance of the program.
     *
     * @param args Not used now.
     ********************************
     */
    public static void main(String args[]){
        System.out.println("\r\n---------sequentialSearchTest--------");
        sequentialSearchTest();

        System.out.println("\r\n--------binarySearchTest-------");
        binarySearchTest();
    }//of main

}//of class DataArray.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值