查找算法

        算法简介 : 指解题方案的准确而完整的描述,是一系列解决问题的清晰指令
        1.时间复杂度   T(n)=O(f(n))
        2.空间复杂度   S(n)=O(f(n))
        一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两方面衡量。
 
 

  查找算法和排序算法(下篇讲)是最基础也是最重要的两类算法,所以需要熟的掌握这两类算法,并能对这些算法的性能进行分析很重要,这两类算法中主要包括二分查找、快速排序、归并排序等。

  查找算法  

  1.顺序查找

  顺序查找又称线性查找。它的过程为:从查找数组的最后一个元素开始逐个与给定数比较,若某个记录的数和给定值比较相等,则查找成功;否则,一直查找到第一个数,若都不相等,则表明数组中没有该指定数,则查找失败。它的缺点就是效率低下

  实现如下:

public class sequential { //顺序查找
    
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 给定的有序数组,顺序查找给定的data值
        int data = 3;
        sequentialSearch(arr, data);
    }

    private static void sequentialSearch(int[] arr, int data) {
        for (int i = arr.length - 1; i < arr.length; i--) {
            System.out.print(arr[i]);
            if (arr[i] == data) {
                System.out.println();
                System.out.println("通过顺序查找的到数的下标是:" + i);
                System.out.println("对应的数date是:" + arr[i]);
                return;
            }
        }
        System.out.println("没有查找到对应的data");
    }

}

-------------------------控制台输出
9876543
通过顺序查找的到数的下标是:2
对应的数date是:3

  2.二分查找 

  二分查找又称折半查找,对于有序表来说,它的优点是比较次数少,查找速度快,平均性能好。

  二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。

  二分查找的时间复杂度为O(logn)。

  实现如下:

public class dichotomy { // 二分查找
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //给定的有序数组,二分查找给定的data值
        int data = 3;
        int subscript = dichotomySearch(arr, data);
        if (subscript != -1) { //查找到返回查找的下标,查找不到返回-1
            System.out.println("通过二分查找的到数的下标是:" + subscript);
            System.out.println("对应的数date是:" + arr[subscript]);
        }else{
            System.out.println("没有查找到对应的data");
        }
    }

    private static int dichotomySearch(int[] arr, int data) {
        int start = 0;            // 索引开始
        int end = arr.length - 1; // 索引结束
        while (start <= end) {    
            int mid = (start + end) / 2; 
            if (data == arr[mid]) {
                return mid;
            } else if (data < arr[mid]) { 
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return -1;
    }
}

 

posted @ 2018-07-02 17:30  仰望星空的脚踏实地  阅读(227)  评论(0编辑  收藏  举报