typedef int KeyType;
typedef int InfoType;
typedef struct {
KeyType key;
InfoType info;
}RecType;
顺序查找
//顺序查找
int SeqSearch(RecType R[], int n, KeyType k)
{
int i = 0;
while (i < n && R[i].key != k)
i++;
if (i >= n)
return 0;
else
return i + 1;
}
//顺序查找 哨兵
int SeqSearch1(RecType R[], int n, KeyType k)
{
int i = 0;
R[n].key = k;
while (R[i].key != k)
i++;
if (i == n)
return 0;
else
return i + 1;
}
折半查找
// 折半查找
int BinSearch(RecType R[], int n, KeyType k)
{
int low = 0, high = n - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (k == R[mid].key)
return mid + 1;
else if (k < R[mid].key)
high = mid - 1;
else
low = mid + 1;
}
return 0;
}
分块查找
// 分块查找
// 索引表数据类型
#define MAXI 20
typedef struct {
KeyType key; //关键字类型
int link; //对应块起始下标
}IdxType;
int IdxSearch(IdxType I[], int b, RecType R[], int n, KeyType k)
{
int s = (n + b - 1) / b; //s 每块元素个数 n/b|~~|
int low = 0, high = b - 1;
int mid, i;
// 折半找 块位置
while (low <= high)
{
mid = (low + high) / 2;
if (I[mid].key >= k)
high = mid - 1;
else
low = mid + 1;
}
//在索引表 high+1 块中顺序查找
i = I[high + 1].link;
while (i <= I[high + 1].link + s - 1 && R[i].key != k)
i++;
if (i <= I[high + 1].link + s - 1)
return i + 1;
else
return 0;
}