谭浩强C++课后习题21——折半查找

谭浩强C++课后习题21——折半查找

题目描述:有15个数字由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。

算法思路:从一维数组中查找一个数最简单的方法就是从第一个开始顺序查找,直到找到为止,但是这种方法效率很低,如果有很多个数据就需要查找很多次。折半查找是效率比较高的一种查找方法。基本思路如下:
假如有已经排好序的9个数:1,3,5,7,9,11,13,15,17。
如果想查询3的位置,可先找出中间的数,也叫是num【5】,将3与其比较,发现num【5】>3,显然3应当在num【5】之前,则查找范围缩小一半,循环这样找下去。
在程序中先判断查找数是否在数组范围内,如果不在直接输出差找不到。
如果在数组范围内,设定一个first标记和一个last标记,每轮比较让mid=(first+last)/2,,也就是范围内中间位置,如果查找数等于这个位置的数则返回这个位置,如果比中间的数要大,则查找范围缩小到前面,则让last=mid-1,继续循环;如果比中间的数要小,则查找范围缩小到后面,则让first=mid+1,继续循环。直到结束。如果没有找到则返回-1。
注意:折半查找只能用于排序好的数组。

#include<iostream>
using namespace std;
void sort(int num[], int n) {
	int temp;
	for (int i = 0;i < n - 1;i++) {
		for (int j = 0;j < n - i - 1;j++) {
			if (num[j] < num[j + 1]) {
				temp = num[j];
				num[j] = num[j + 1];
				num[j + 1] = temp;
			}
		}
	}
}
int search(int num[], int n, int searchNum) {
	if (searchNum>num[0] || searchNum<num[n - 1])
		return -1;
	int first = 0, last = n - 1, mid;
	while (first <= last) {
		mid = (first + last) / 2;
		if (searchNum == num[mid]) {
			return mid;
		}
		else if (searchNum > num[mid])
			last = mid - 1;
		else
			first = mid + 1;
	}
	return -1;
}
int main() {
	int n;
	cout << "输入数字个数:";
	cin >> n;
	int* num = new int[n];
	cout << "输入数组:";
	for (int i = 0;i < n;i++)
		cin >> num[i];
	sort(num, n);
	cout << "排序好的数组:";
	for (int i = 0;i < n;i++)
		cout << num[i] << " ";
	cout << endl;
	int searchNum;
	int loca;
	bool flag = true;
	char c;
	while (flag) {
		cout << "输入查找数:";
		cin >> searchNum;
		loca = search(num, n, searchNum);
		if (loca != -1) {
			cout << "位置是:" << loca + 1 << endl;
		}
		else
			cout << "找不到数据" << endl;
		cout << "是否继续?Y/N:";
		cin >> c;
		if (c == 'N')
			flag = false;
		cout << endl;
	}
	return 0;
}

运行测试结果:
在这里插入图片描述

发布了35 篇原创文章 · 获赞 35 · 访问量 592

猜你喜欢

转载自blog.csdn.net/weixin_45295612/article/details/105247011
今日推荐