数据结构(Java)——查找和排序(1)

原创 2015年11月19日 09:58:20

1.查找的定义

    查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素。 对其进行查找的项目的组有时也成为查找池。
    两种常见的查找方式:线性查找和二分查找。
    为了能够查找某一对象,我们就必须将一个对象跟另一个对象进行比较。我们对这些算法的实现就是对某个Comparable对象的数组进行查找。因此,所涉及的元素实现了Comparable接口且彼此是可比较的。我们将在Searching类头中完成这一限制。

2.算法查找

2.1 线性查找

/**
     * 线性查找 在没有找到之前 需要一直遍历
     * 
     * @param data
     * @param min
     * @param max
     * @param target
     * @return
     */
    public static <T extends Comparable<T>> boolean linearSearch(T[] data,
            int min, int max, T target) {

        int index = min;
        boolean found = false;

        while (!found && index <= max) {
            found = data[index].equals(target);
            index++;
        }

        return false;

    }

2.2 二分查找

/**
     * 二分查找:二分查找需要实现数组列表有序,然后每次考察中间元素,排除一半,最好的方法是使用递归实现。
     * @param data
     * @param min
     * @param max
     * @param target
     * @return
     * 
     * 二分查找方法是递归实现的,如果没有找到目标元素,且有更多待查找数据,则该方法将调用自身,同时传递参数,
     * 这些参数缩减了数组内可行候选项的规模。
     * 
     * min和max索引用于确定是否还具有更多的待查找数据,这就是说,如果削减后的查找区间一个元素没有则该方法
     * 不会调用其自身且返回一个false值。
     * 
     * 
     * 
     */
    public static <T extends Comparable<? super T>> boolean binarySearch(T[] data, int min, int max, T target) {
        boolean flag= false;
        int mid = (max+min)/2;

        if(data[mid].compareTo(target)==0){
            flag = true;
        }else if(data[mid].compareTo(target)>0){//中间大于目标
            if(min<=mid-1){
                flag = binarySearch(data, min, mid-1, target);
            }
        }else if(data[mid].compareTo(target)<0){
            if(mid+1<=max){
                flag = binarySearch(data, mid+1, max, target);
            }
        }

        return flag;

    }

2.3 查找比较
线性查找,最好情形是目标元素刚好是我们考察项目组的第一个项目。最糟糕的情形是出现在目标不再该组的时候,且在我们确定它不在之前不得不考察每一个元素。算法的期望是n/2,因此线性查找算法具有线性时间复杂度O(n)。
二分查找,因为我们每比较一回我们就能够将剩余数据削减一半,所以我们可以更快的找到元素。最好的情况一次找到,最差是排除所有元素,我们不得不进行log2n 次比较。因此,找到位于该查找池中某一元素的预期情形是大约(log2n)/2次比较。

线性查找比较简单,编程调试更容易实现。
线性查找无需花费额外成本来排序该查找列表。
二分查找的复杂度是对数级的,这使得它对于大型查找池非常有效率。

3.排序简介

排序:基于某一个标准,将某一组项目按照某个规定顺序排列。
基于效率排序算法通常分为两类:顺序排序和对数排序。
顺序排序:它通常使用一对嵌套循环对n个元素进行排序,需要大约n2 次比较。
对数排序:它对n个元素进行排序大约需要nlog2n 次比较。
在n较小的时候,这两类算法之间几乎不存在任何实际差别。

4.泛型:补充资料

package ds.java.ch09;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author LbZhang
 * @version 创建时间:2015年11月19日 上午11:16:20
 * @description 类说明
 * 
 * 综合分析:
 * extends 可用于的返回类型限定,不能用于参数类型限定。
 * super 可用于参数类型限定,不能用于返回类型限定。
 * 
 * 带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取.
 */
public class Genertic {

    public static void main(String[] args) {
        /**
         * List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,
         * 所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能
         * 添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。
         */
        List<? extends Fruit> felist = new ArrayList<Apple>();
        //flist.add(new Apple());
        Fruit f = felist.get(0);

        /**
         * List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,
         * 因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit
         * 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.
         * 
         */
        List<? super Fruit> fslist = new ArrayList<Fruit>();
        fslist.add(new Apple());

        //Fruit fs = fslist.get(0);

    }

}

class Food {
}

class Fruit extends Food {
}

class Apple extends Fruit {
}

class RedApple extends Apple {
}

总结:
extends 可用于的返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。

带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构与算法--查找与排序(一)

Top 线性查找二分查找冒泡排序插入排序选择排序快速排序归并排序 1 线性查找 1.1 问题 线性查找,又称为顺序查找,是指在所有给定的值中从一端开始逐个检查每个元素是否为要查...
  • opera95
  • opera95
  • 2016年04月22日 08:30
  • 2815

数据结构实验:查找和排序

查找和排序 实验目的   1. 掌握顺序查找,二分法查找,分块查找的算法。   2.掌握各种排序算法及其性能的比较 二、实验内容 1.编写一个程序输出在顺序表{13,22,35,43,54,...
  • u012278856
  • u012278856
  • 2014年06月03日 22:12
  • 697

Java实现动态表查找--二叉排序树

定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:  (1)若左子树不空,则左子树上所有结点的键值均小于或等于它的根结点的键值;  (2)若右子树不空,则右子树上所有结点的键值均大于或等于它...
  • u011514810
  • u011514810
  • 2017年03月04日 15:01
  • 366

数据结构——排序查找算法实现

前面转载了一篇讲排序算法的文章,这几天将排序和查找算法进行了实现,在这里贴出代码来。...
  • u010757264
  • u010757264
  • 2016年08月18日 16:13
  • 466

java中排序与查找

java中排序和二分查找
  • wwyl1001
  • wwyl1001
  • 2016年01月26日 11:00
  • 301

[Java]各种基础的查找和排序算法总结

查找方法: 1.顺序查找。 按数组的顺序从前往后一直比较,直到找到目标值返回。 优点:对数组的结构没有特定的要求,算法简单。 缺点:当数组个数n较大时,效率低下。 时间复杂度:最大时间复杂度是O(n)...
  • qq284565035
  • qq284565035
  • 2014年12月02日 16:30
  • 1834

Java数据结构----树--二叉查找(搜索或排序)树BST

二叉查找树(Binary Search Tree),是基于二叉树,具有下列性质: 1、若左子树不空,则其左子树上的所有结点的值均小于根结点的值; 2、若右子树不空,则其右子树上的所有结点的值均大于根结...
  • oChangWen
  • oChangWen
  • 2016年02月26日 17:50
  • 899

数据结构C语言版之查找(折半选择快速等)

//查找: #include #include #include typedef struct{ int *elem; int length; }SStable; typedef struct ...
  • qq_26816591
  • qq_26816591
  • 2015年12月24日 12:35
  • 643

数据结构中排序和查找的算法

(一)排序算法     排序算法是一种基本并且常用的算法。由于实际工作中要处理的数据量巨大,所以对排序算法有很高的速度要求。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。O方法的...
  • carefree31441
  • carefree31441
  • 2008年09月13日 03:35
  • 3775

Java排序与查找

参考博客地址 http://blog.csdn.net/pzhtpf/article/details/7560294
  • googlevsbing
  • googlevsbing
  • 2016年02月26日 10:41
  • 485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——查找和排序(1)
举报原因:
原因补充:

(最多只允许输入30个字)