7.2编写程序实现:输入10个数据,按从小到大用选择法排序,然后输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

该程序实现了输入十个整数进行升序排序,然后使用二分查找法寻找指定数字。用户可以输入要查找的数字,程序将返回数字在排序后的数组中的位置或者提示未找到该数。
#include<stdio.h>
int main()
{
	int a[10];
	int i, j, t, min;
	int left = 0;
	int right = sizeof(a) / sizeof(a[0]);
	int key = 0;
	int mid;
	printf("请输入十个数:\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);

	for (i = 0; i < 10; i++)
	{
		min = a[i];
		for (j = i + 1; j < 10; j++)
		{
			if (a[j] < a[i])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%d  ", a[i]);



	printf("请输入要查找的数字: ");

	scanf("%d", &key);

	// 二分查找

	while (left < right)

	{
		// 找到中间位置

		mid = left + ((right - left) >> 1);

		if (key == a[mid])

		{
			printf("%d\n", mid+1);

			break;

		}

		else if (key < a[mid])

		{
			right = mid;

		}

		else

		{
			left = mid + 1;

		}

	}

	if (left >= right)

		printf("无此数\n");

	return 0;

}

本题要求实现三种查算法的比较:线性表查、监视哨查、折半查。 目的: 领会顺序表 三种查算法的设计,并比较。 内容: 编写程序实现顺序表的各种基本运算算法,并在此基础上设计一个主程序,完成如下功能: 实现顺序表的基本运算和三种查算法,具体如下: 随机产生20个0-100以内的并存入数组dataR; (1)初始化顺序表L (2)依次插入数组dataR的元素 (3)输出顺序表L (4)顺序表L长度 (5)输入要查数据(查成功):sa (6)线性表查数据元素sa,返回表中位置、比较的序列、比较次,并输出 (7)监视哨查数据元素sa,返回表中位置、比较的序列、比较次,并输出 (8)折半查数据元素sa,返回表中位置、比较的序列、比较次,并输出 (9)输入要查数据(查失败):sb (10)线性表查数据元素sb,返回表中位置、比较的序列、比较次,并输出 (11)监视哨查数据元素sb,返回表中位置、比较的序列、比较次,并输出 (12)折半查数据元素sb,返回表中位置、比较的序列、比较次,并输出 (13)释放顺序表L 要求:实现下列函的设计: int LocateElem_Sq(SqList L, ElemType e ,int &count); int Search_Seq(SqList ST, int key,int &count); int Search_Bin(SqList ST,int key,int &count); void BubbleSort(SqList &L); 函接口定义: int LocateElem_Sq(SqList L, ElemType e ,int &count);//算法2.3 顺序表的查,L为查顺序表,e为需查数据元素,count为查 /*算法2.3 顺序表的查,ST为查顺序表,key为需查数据元素,count为查顺序表L中顺序其关键字等于e的数据元素。若到,则函为该元素在表中的位置,否则为0 L为查顺序表,e为需查数据元素,count为查 */ int Search_Seq(SqList ST, int key,int &count); /*算法7.2,监视哨查, 在顺序表ST中顺序其关键字等于key的数据元素。若到,则函为该元素在表中的位置,否则为0 ST为查顺序表,key为需查数据元素,count为查 */ int Search_Bin(SqList ST,int key,int &count); /*算法7.3,折半查, 在顺序表ST中顺序其关键字等于key的数据元素。若到,则函为该元素在表中的位置,否则为0 ST为查顺序表,key为需查数据元素,count为查 */ void BubbleSort(SqList &L); /*排序算法顺序表L进行从小到大排序。折半查需要对顺序表先排序再查。 L为排序顺序表 */ 在这里解释接口参。例如:其中 N 和 D 都是用户传入的参。 N 的不超过int的范围; D 是[0, 9]区间内的个位。函须返回 N 中 D 出现的次。 裁判测试程序样例: #include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERF -2 typedef int Status; //Status 是函返回类型,其是函结果状态代码。 typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型 #define MAXSIZE 100 //顺序表可能达到的最大长度 #define MAX 100 //随机产生0-MAX之间的随机 typedef struct { ElemType *elem; //存储空间的基地址 int length; //当前长度 } SqList; Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化 //构造一个空的顺序表L } int ListLength_Sq(SqList L)//返回顺序表的长度 { } Status GetElem(SqList L, int i, ElemType &e) {//算法2.2 顺序表的取 } //顺序表的插入 Status ListInsert_Sq(SqList &L, int i, ElemType e) { //算法2.4 顺序表的插入 //在顺序表L中第i个位置之前插入新的元素e } //带监视哨的 顺序表插入 Status ListInsert_Sq_m(SqList &L, int i, ElemType e) { //算法2.4 顺序表的插入, //在顺序表L中第i个位置之前插入新的元素e } Status DestroyList_Sq(SqList L){//释放顺序表 } Status DispList_Sq(SqList L,int beg,int en){//输出顺序表L中的数据元素,从位置beg开始到位置en结束 } void show_result(int position ,int count, ElemType s) { if(position>0) cout<<" 查成功!元素在表中位置为:"<<position<<"\t"<<"查比较的次为:"<<count<<endl; else cout<<" 查失败!表中不存在元素"<<s<<"。"<<"\t"<<"查比较的次为:"<<count<<endl; } int main() { int i,j,count=0,position=0; SqList L,L_seq,L_bin; ElemType e; ElemType dataR[20],sa,sb; cout<< "请输入一组数据,不超过20个,以-1为结束符:"<<" "; j=0;//记录dataR的长度 cin>>e; while(j>19 ||e!=-1 ) { dataR[j]=e; //随机产生0-MAX的随机 j++; cin>>e; } cout<<endl; cout<<"查的基本运算如下:\n"; cout<<" (1)初始化顺序表L\n"; InitList_Sq(L); InitList_Sq(L_seq); InitList_Sq(L_bin); cout<<" (2)依次插入数据元素dataR\n"; for(i=0;i<20;i++) { ListInsert_Sq(L,i+1, dataR[i]);} //线性顺序表的插入 cout<<" (3)输出顺序表L:"; DispList_Sq(L,1,L.length); //输出顺序表L中的数据元素,从位置1开始到位置length+1结束 cout<<" (4)顺序表L长度:"<< ListLength_Sq(L)<<endl; //sa=dataR[5]; cout<<" 请输入一个要查sa:\n"; cin>>sa; position=0; //顺序法 cout<<" (5)查sa(顺序算法):"<<"sa="<< sa<<endl; cout<<" 顺序的比较的数据元素的序列:"; position=LocateElem_Sq(L,sa,count); cout<<endl; show_result(position,count,sa); //监视哨查法 cout<<" (6)查sa(监视哨查算法):"<<"sa="<< sa<<endl; cout<<" 监视哨查的比较的数据元素的序列:"; for(i=0;i<20;i++) //空出L.elem[0]的位置做监视哨 { ListInsert_Sq_m(L_seq,i+2, dataR[i]);} //带监视哨的顺序表的插入 // DispList_Sq(L_seq,2,L_seq.length+1); //输出顺序表L中的数据元素,从位置1开始到位置length+1结束 position=0; count=0; position=Search_Seq(L_seq,sa,count); cout<<endl; show_result(position,count,sa); //折半查算法 cout<<" (7)查sa(折半查算法):"<<"sa="<< sa<<endl; for(i=0;i<20;i++) { ListInsert_Sq(L_bin,i+1, dataR[i]);} //线性顺序表的插入 //cout<<" 排序数据元素的序列为:"; //DispList_Sq(L_bin,1,L.length); //排序顺序表L中的数据元素,从位置1开始到位置length+1结束 BubbleSort(L_bin); cout<<" 排序数据元素的序列为:"; DispList_Sq(L_bin,1,L.length); //输出排序顺序表L中的数据元素,从位置1开始到位置length+1结束 position=0; count=0; cout<<" 折半查的比较的数据元素的序列:"; position=Search_Bin(L_bin,sa,count); cout<<endl; show_result(position,count,sa); //查sb,不存在表中的元素 sb=121; position=0; count=0; //顺序法 cout<<" (8)查sb(顺序算法):"<<"sb="<<sb<<endl; cout<<" 顺序的比较的数据元素的序列:"; position=LocateElem_Sq(L,sb,count); cout<<endl; show_result(position,count,sb); //监视哨查法 cout<<" (9)查sb(监视哨查算法):"<<"sb="<< sb<<endl; cout<<" 监视哨查的比较的数据元素的序列:"; position=0; count=0; position=Search_Seq(L_seq,sb,count); cout<<endl; show_result(position,count,sb); //监视哨查失败,比顺序表多比较1次,多的是与监视哨key的比较。 //折半查算法 cout<<" (10)查sb(折半查算法):"<<"sb="<< sb<<endl; position=0; count=0; cout<<" 折半查的比较的数据元素的序列:"; position=Search_Bin(L_bin,sb,count); cout<<endl; show_result(position,count,sb); cout<<" (12)释放顺序表-L,L_seq,L_bin\n"; DestroyList_Sq(L); DestroyList_Sq(L_seq); DestroyList_Sq(L_bin); return 0; } 输入样例: 请输入一组数据,不超过20个,以-1为结束符:。例如: 41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10 -1 18 105 输出样例: 程序运行输出结果如下:。例如: 请输入一组数据,不超过20个,以-1为结束符: 查的基本运算如下: (1)初始化顺序表L (2)依次插入数据元素dataR (3)输出顺序表L:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10 (4)顺序表L长度:17输入一个要查sa: (5)查sa(顺序算法):sa=18 顺序的比较的数据元素的序列:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 查成功!元素在表中位置为:16 查比较的次为:16 (6)查sa(监视哨查算法):sa=18 监视哨查的比较的数据元素的序列:10 18 查成功!元素在表中位置为:16 查比较的次为:2 (7)查sa(折半查算法):sa=18 排序数据元素的序列为:0 5 10 18 24 27 34 41 45 58 61 64 67 69 78 81 91 折半查的比较的数据元素的序列:45 18 查成功!元素在表中位置为:4 查比较的次为:2输入一个要查sb: (8)查sb(顺序算法):sb=105 顺序的比较的数据元素的序列:41 67 34 0 69 24 78 58 64 5 45 81 27 61 91 18 10失败!表中不存在元素105。 查比较的次为:17 (9)查sb(监视哨查算法):sb=105 监视哨查的比较的数据元素的序列:10 18 91 61 27 81 45 5 64 58 78 24 69 0 34 67 41 查失败!表中不存在元素105。 查比较的次为:18 (10)查sb(折半查算法):sb=105 折半查的比较的数据元素的序列:45 67 78 81 91 查失败!表中不存在元素105。 查比较的次为:5 (12)释放顺序表-L,L_seq,L_bin 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB C++ (g++)
最新发布
10-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值