# 折半查找（数据结构，实验）

#include<stdio.h>//rcd 0~M-1   list 1~n

#include<stdlib.h>

#include<time.h>

#define M 15

typedef int keytype;

typedef struct

{

keytype key;

char name[10];

}rcdtype;

typedef struct

{

rcdtype* rcd;

int length;

}rcdlist;

int initlist(rcdlist& l)//初始化

{

l.rcd = (rcdtype*)malloc(M * sizeof(rcdtype));

l.length = 0;

return 1;

}

{

int i;

srand(time(0));//时间种子，根据时间生成随机数

for (i = 1; i <= n; i++)//生成n个随机数

l.rcd[i].key = rand() % 100;//rand函数生成随机数。%100使生成的随机数为十位数

l.length = n;

return 1;

}

void output(rcdlist& l)//输出列表

{

int i;

for (i = 1; i <= l.length; i++)

printf("%d\t", l.rcd[i].key);//输出key，没输出name

printf("\n");

}

int part(rcdlist& l, int low, int high)//快速排序找到每次直接插入排序的t

{

keytype x;

l.rcd[0] = l.rcd[low];//把第一条记录给哨兵

x = l.rcd[0].key;//x为哨兵位置（既第一条记录）的关键字

while (low < high)//当low=high时结束排序

{

while (low < high && x <= l.rcd[high].key)//哨兵位置关键字小于high

high--;//high左移

l.rcd[low] = l.rcd[high];//直到哨兵位置关键字＞high，把较大值移到较小值所在的——偏右侧的记录

while (low < high && x >= l.rcd[low].key)

low++;

l.rcd[high] = l.rcd[low];

}

l.rcd[low] = l.rcd[0];

return low;//此时low==high，此时的位置为枢轴

}

void quicksort(rcdlist &l,int low,int high)//快速排序

{

int t;//按枢轴t进行分割，将待排序记录分割为独立的两部分，

if (low < high)//当low＜high时结束

{

t = part(l, low, high);//找到t，枢轴

quicksort(l, low, t - 1);//递归排序关键字小的部分

quicksort(l, t + 1, high);//递归排序关键字大的部分

}

}

int binserch1(rcdlist l, keytype key, int low, int high)

{

//折半查找——递归

int mid;

mid = (low + high) / 2;

if (low > high)

return 0;

if (key == l.rcd[mid].key)

return mid;

else if (key < l.rcd[mid].key)

return binserch1(l, key, low, mid - 1);

else

return binserch1(l, key, mid + 1, high);

}

int binserch2(rcdlist l, keytype key, int low, int high)

{

//折半查找——非递归

int mid;

while (low <= high)

{

mid = (low + high) / 2;

if (key == l.rcd[mid].key)

return mid;

else if (key < l.rcd[mid].key)

high = mid - 1;

else

low = mid + 1;

}

return 0;

}

int main()

{

int n,t;

rcdlist l;

keytype x;

initlist(l);//初始化

scanf_s("%d", &n);//输入需要几个随机数

output(l);

quicksort(l,1,l.length);//快速排序

output(l);

scanf_s("%d", &x);

t = binserch2(l, x, 1, l.length);//折半查找的序列要有序

if (t)

return printf("%d\n", t);

else

return printf("没有此元素\n");

return 0;

}

## 快速排序和折半查找失败——使用递归算法

• 21
点赞
• 19
收藏
觉得还不错? 一键收藏
• 0
评论
06-02
12-20 1506
04-26 1275
05-15 1240
12-21
06-16 2383
12-24 449
11-25 2540
11-30 1万+
06-20 1123
01-28 4万+

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。