活动地址:CSDN21天学习挑战赛
一.索引顺序查找
1.逻辑分析
- 文字分析
索引顺序查找又叫分块查找,要求将待查元素均匀分成块,且前面一块的所有元素比后一块的最小元素小,即块间按大小排序,块内不排序,所以要建立一个块的最大关键字表,也就是索引表。
- 动图分析
例:
输入十五个元素:
11 12 18 28 39 56 69 89 96 122 135 146 156 256 298
查找元素:
key=96
查找成功,位置为9
索引顺序查找
2.代码
- 算法代码
struct block //定义块
{
int key; //块的关键字
int start; //块的起始
int end; //块的结束
}block_table[4];
int block_search(int key,int a[]) //定义分块查找
{
int j = 0;
int i = 1;
while (i <= 3 && key > block_table[i].key) //比较块的最大值
{
i++;
}
if (i > 3) //提前退出查找
return 0;
j = block_table[i].start; //块的起始地址
while (a[j] != key && j <= block_table[i].end) //顺序查找
{
j++;
}
if (j <= block_table[i].end)
return j; //返回元素所在位置
else
return 0;
}
- 完整代码
#include <stdio.h>
//
//索引顺序查找
//
struct block //定义块
{
int key; //块的关键字
int start; //块的起始
int end; //块的结束
}block_table[4];
int block_search(int key,int a[]) //定义分块查找
{
int j = 0;
int i = 1;
while (i <= 3 && key > block_table[i].key) //比较块的最大值
{
i++;
}
if (i > 3) //提前退出查找
return 0;
j = block_table[i].start; //块的起始地址
while (a[j] != key && j <= block_table[i].end) //顺序查找
{
j++;
}
if (j <= block_table[i].end)
return j; //返回元素所在位置
else
return 0;
}
int main()
{
int arr[16] = { 0 };
int i = 0, j = 0;
int key = 0; //需查找的元素
int k = 0; //若元素存在,元素的位置
for (i = 1;i < 16;i++) //顺序输入数据
{
scanf("%d", &arr[i]);
}
for (i = 1;i < 4;i++) //分块
{
block_table[i].start = j + 1; //该块的起始
j = j + 1;
block_table[i].end = j + 4; //该块的结束
j = j + 4;
block_table[i].key = arr[j]; //该块的关键字
}
printf("请输入需要查找的元素:\n");
scanf("%d", &key);
k = block_search(key,arr); //查找算法
if (k != 0)
printf("查找成功,元素位置为%d\n", k);
else
printf("查找失败\n");
return 0;
}
3.时间复杂度和空间复杂度
- 时间复杂度
O(logn)
-空间复杂度
O(n)