- 折半查找 (10分)- 太简单
成绩 | 10 | 开启时间 | 2019年12月1日 星期日 18:00 |
---|---|---|---|
折扣 | 0.8 | 折扣时间 | 2019年12月25日 星期三 23:55 |
允许迟交 | 否 | 关闭时间 | 2020年01月1日 星期三 23:55 |
折半查找的查找过程:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
每条待查记录包含关键字项和其他项,如关键字项为15,其他项为该记录在查找表里的原序号4。
对无序表的查找,还需要事先排列成有序表,再进行折半查找。
输入:
5 (记录的条数)
各记录项:如 32 1
输出:
已按关键字排列好的非递减序列:如 (16 2)(20 5)(32 1)(35 3)(91 4)
找不到时输出: error
#include <stdio.h>
int data[1024][2];
void swap(int a, int b)
{
int i, temp;
for (i = 0; i < 2; i++)
{
temp = data[a][i];
data[a][i] = data[b][i];
data[b][i] = temp;
}
}
void qsort(int begin, int end)
{
if (begin < end)
{
int i, j;
i = begin + 1;
j = end;
while (i < j)
{
if (data[i][0] > data[begin][0])
swap(i, j--);
else
i++;
}
if (data[i][0] > data[begin][0])
i--;
swap(begin,i);
qsort(begin, i);
qsort(j, end);
}
}
int main()
{
int i, n, testnum, compare[3] = {0}, flag = -1, temp;
scanf("%d", &n);
compare[1] = n / 2;
compare[2] = n - 1;
for (i = 0; i < n; i++)
scanf("%d%d", &data[i][0], &data[i][1]);
qsort(0, n - 1);
for (i = 0; i < n; i++)
printf("(%d %d)", data[i][0], data[i][1]);
printf("\n");
scanf("%d", &testnum);
while (1)
{
if (testnum < data[compare[0]][0] || testnum > data[compare[2]][0])
break;
if (testnum == data[compare[1]][0])
{
flag = compare[1];
break;
}
else if (testnum < data[compare[1]][0])
{
compare[2] = compare[1];
compare[1] = (compare[0] + compare[1]) / 2;
}
else
{
compare[0] = compare[1];
temp = (compare[1] + compare[2]) / 2;
if (temp == compare[1])
break;
compare[1] = temp;
}
}
if (flag == -1)
printf("error\n");
else
printf("(%d %d)\n",data[flag][0],data[flag][1]);
return 0;
}