每天进步一点点之查找

1,顺序查找

#include <bits/stdc++.h>
using namespace std;
#define MaxSize 100
struct ElementType{
    string name;
    int age;
};
typedef struct Node* List;
struct Node{
    ElementType Data[MaxSize];
    int length;
};
bool equal(ElementType a1, ElementType a2){
    if(a1.age==a2.age && a1.name == a2.name)
        return true;
    return false;
}
int SequentialSearch(List Tb1,ElementType K){
    int i;
    Tb1->Data[0]=K;
    for(i=Tb1->length;!equal(Tb1->Data[i],K);i--);
    return i;//成功返回下标,不成功返回0
}

  a,设立哨兵的好处:不用判断下标是否越界。

2,二分查找

int BinarySearch(List Tbl,ElementType K){
    //表Tbl中查找K的元素,默认表中元素升序排列 
    int left,right,mid,NoFound=-1;
    left=1;//因为0位是哨兵 
    right=Tbl->length;
    while(left<=right){
        mid=(left+right)/2;
        if(K<Tbl->Data[mid]) right=mid-1;  
        else if(K>Tbl->Data[mid]) left = mid+1;  
        else return mid;
    }
    return NotFound;// not found 
}

 

  a,要求是数组和有序

  b,时间复杂度是log(n)

  b,比较次数:

    每次比较mid的值和查找的值后,如果不相等,mid会被加1或者-1然后赋值给right(left)。

    不成功时:

      mid=right=left(而不是right和left相差1)

    比较次数:

      

posted @ 2020-07-19 15:16  dream_fu  阅读(132)  评论(0编辑  收藏  举报