静态查找_顺序查找&二分查找

2019-02-25  本文已影响0人  Mad_Elliot

查找基本概念:查询特定元素是否在表中的过程,存在则输出该元素位置,不存在则输出失败标志。
静态查找:只查找,不改变表中数据。
动态查找:既查找,又改变。

顺序查找:(线性查找)

从顺序表的一端开始往后比较,找到返回表中位置,找不到返回-1。

//while循环
static int SeqSearch1(int[] a, int x)
{
    int i = 0;
    while (i < a.Length && a[i] != x)
        i++;
    if (i < a.Length && a[i] == x) return i;
    else return -1;
}
//for循环
static int SeqSearch2(int[] a, int x)
{
    for (int i = 0; i < a.Length; i++)
    {
        if (a[i] == x)
        {
            return i;
        }
    }
    return -1;
}

总结:
1、算法简单,且对顺序结构或链表结构均适用;
2、时间效率:O(n),效率太低。


二分查找:(折半查找)

基本思想:在一个排好序的表中,将要找的key与正中元素相比,若key小,则缩小至前半部内查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。

static int BinarySearch(int[] a, int x)
{
    int low = 0;//首坐标
    int high = a.Length - 1;//尾坐标
    int mid;//中坐标
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (a[mid] == x)
            return mid;

        if (a[mid] > x)//x小于中间值,x位于前半段[low, mid-1]中
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}

总结:
1、查找本身的时间效率很高O(nlog2n),但排序本身是一种费时的运算;
2、二分查找只使用于顺序表,且是有序的顺序表,链表无法实现二分查找
3、二分查找特别使用于那种一经建立就很少改动,而又经常需要查找的线性表。

上一篇下一篇

猜你喜欢

热点阅读