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)
比较次数: