C语言的查找

导读:本篇文章讲解 C语言的查找,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

顺序查找

猜数游戏

完整代码

二分查找

思路分析

二分查找方法的具体实现

二分查找的完整代码

顺序查找

猜数游戏

        从键盘中任意输入一个数,判断数列中是否包含该数【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值, 找不到提示没有。

  • 首先对整个数组进行遍历,如果相等返回数组下标
//遍历
int i;
for (i = 0; i < arrLen; i++) {
	if (arr[i] == val) {
		return i;
	}
}
//如果在for循环中没有找到,则返回-1;
return -1;
  • main方法中,arrLen使用sizeof()方法可以得到,并且用index获取方法的返回值
int arr[] = { 23,1,34,88,100 };
int arrLen = sizeof(arr) / sizeof(int);
int index = seqSearch(arr, arrLen, 10);
if (index != -1) {
	printf("找到了,当前下标值为%d", index);
		
}
else {
	printf("没有找到该数据!");
}
getchar();

完整代码

//顺序查找
#include<stdio.h>

int seqSearch(int arr[], int arrLen, int val) {
	//遍历
	int i;
	for (i = 0; i < arrLen; i++) {
		if (arr[i] == val) {
			return i;
		}
	}
	//如果在for循环中没有找到,则返回-1;
	return -1;
}

void main() {

	int arr[] = { 23,1,34,88,100 };
	int arrLen = sizeof(arr) / sizeof(int);
	int index = seqSearch(arr, arrLen, 10);
	if (index != -1) {
		printf("找到了,当前下标值为%d", index);
		
	}
	else {
		printf("没有找到该数据!");
	}
	getchar();
}

二分查找

        请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,
        输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示”没有这个数”。二分查找的前提是,该数组是一个有序数组

思路分析

  • 比如我们要查找的数是findVal
  • 如果midVal >  findVal 说明, 应该在midVal 的左边查找
  • 如果midVal <  findVal 说明, 应该在midVal 的右边查找
  • 如果midVal ==  findVal, 说明找到

二分查找方法的具体实现

  • 先找到数组中间这个数的下标,两者相加/2得到的是中间的位置,中间位置对应的就是数组的中间值
int midIndex = (leftIndex + rightIndex) / 2; 
int midVal = arr[midIndex];
  • 之后进行递归操作
//如果midVal >  findVal 说明, 应该在midVal 的左边查找
if(midVal > findVal) {
	binarySearch(arr, leftIndex, midIndex-1, findVal);//!!!
} else if(midVal < findVal){//如果midVal <  findVal 说明, 应该在midVal 的右边查找
	binarySearch(arr, midIndex+1, rightIndex, findVal);//!!!
} else {
	return midIndex; //返回该数的下标
}
  • 递归操作之后,如果左边的下标值大于右边的下标值,则说明这个数组都比较过,但还是没有找到
if( leftIndex > rightIndex) {
	return -1;//!!!!
}

二分查找的完整代码

//二分查找
#include<stdio.h>

//二分查找
int binarySearch(int arr[], int leftIndex, int rightIndex, int findVal) {
	
	
	//先找到数组中间这个数 midVal
	int midIndex = (leftIndex + rightIndex) / 2; 
	int midVal = arr[midIndex];
	//如果leftIndex > rightIndex, 说明这个数组都比较过,但是没有找到
	if( leftIndex > rightIndex) {
		return -1;//!!!!
	}
	//如果midVal >  findVal 说明, 应该在midVal 的左边查找
	if(midVal > findVal) {
		binarySearch(arr, leftIndex, midIndex-1, findVal);//!!!
	} else if(midVal < findVal){//如果midVal <  findVal 说明, 应该在midVal 的右边查找
		binarySearch(arr, midIndex+1, rightIndex, findVal);//!!!
	} else {
		return midIndex; //返回该数的下标
	}


}

void main() {

	int arr[] = { 1,8, 10, 89, 1000, 1234 };
	int arrLen = sizeof(arr) / sizeof(int);
	int index = binarySearch(arr, 0, arrLen - 1, 1000);
	if (index != -1) {
		printf("找到 index = %d", index);
	}
	else {
		printf("没有找到");
	}
	getchar();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83268.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!