1.二分查找
二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定的关键字key进行比较,
若相等,则查找成功;若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找;
若key值比该关键字值小,则要找的元素一定在左子表中,继续对左子表进行折半查找。如此地推,直到查找成功
或查找失败(查找范围为0)。
#include<stdio.h>
void binary_search(
int key,
int a[],
int n)
{
int low, high, mid, count =
0, count1=
0;
low =
0;
high = n -
1;
while (low < high)
{
count++;
mid = (low + high) /
2;
if (key < a[mid])
high = mid -
1;
else if (key>a[mid])
low = mid +
1;
else if (key == a[mid])
{
printf(
"查找成功!\n查找%d次!a[%d]%d", count, mid, key);
count1++;
break;
}
}
if (count1 ==
0)
printf(
"查找失败!");
}
void main()
{
int key, a[
100], n;
printf(
"请输入数组的长度:\n");
scanf_s(
"%d", &n);
printf(
"请输入数组元素:\n");
for (
int i =
0; i < n; i++)
scanf_s(
"%d", &a[i]);
printf(
"请输入你想查找的元素:\n");
scanf_s(
"%d", &key);
binary_search(key, a, n);
printf(
"\n");
}
2.分块查找
分块查找也称为索引顺序查找,要求将待查找的元素均匀的分块,块间按大小排序,块内不排序,
所以要建立一个块的最大(或最小)关键字表,称为索引表。
本实例中给出的15个数按关键字大小分成了3块,这15个数的排列是一个有序序列,也可以给出
无序序列,**但必须满足分在第一块中的任意数都小于第二块中的所有数,第二块中的所有数都**
**小于第三块中的所有数。**当要查找关键字key的元素时,先后顺序查找在已建好的索引表中查
找出key所在的块中,再在对应的块中顺序查找key,若key存在,则输出其相应的位置,否则输
出提示信息。
#include <stdio.h>
struct index
{
int key;
int start;
int end;
}index_table[
4];
int block_search(
int key,
int a[])
{
int i, j;
i =
1;
while (i <=
3 && key > index_table[i].key)
i++;
if (i >
3)
return 0;
j = index_table[i].start;
while (j <= index_table[i].end&&a[j] != key)
j++;
if (j > index_table[i].end)
j =
0;
return j;
}
void main()
{
int i, j =
0,k, key, a[
16];
printf(
"请输入15个数:\n");
for (i =
1; i <
16; i++)
scanf_s(
"%d", &a[i]);
for (i =
1; i <=
3; i++)
{
index_table[i].start = j +
1;
j = j +
1;
index_table[i].end = j +
4;
j = j +
4;
index_table[i].key = a[j];
}
printf(
"请输入你想查找的元素:\n");
scanf_s(
"%d", &key);
k = block_search(key, a);
if (k !=
0)
printf(
"查找成功,其位置是:%d\n", k);
else
printf(
"查找失败!");
}
3.哈希查找
(进一步待完善)