您现在的位置是:首页 >技术杂谈 >C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n网站首页技术杂谈
C语言:使用 普通方法 和 二分查找算法(折半查找算法) 在一个有序数组中查找具体的某个数字n
题目:
从键盘输入数字n,在一个 有序数组 中查找具体的某个数字n。
=========================================================================
思路一:普通方法
(逻辑简单,在无序数组中也可以使用,但效率较低,需要逐个查找)
总体思路:
(一). 设置初始数组,生成相关变量;
(二). 使用for循环在数组中进行逐个查找,
for循环 中使用 if条件判断语句 判断n是否在数组中,
找到则使用 break 跳出循环,打印相应信息;
(三). 未找到跳出 for循环 后,再使用 if语句 判断是否已遍历完了数组,
未找到 n 且已遍历完数组则打印相应信息。
第一步:
(1). 设置初始数组:int arr[];
(2). 生成相关变量:
int n = 0; -- 存放从键盘输入的要查找的值;
int i = 0; -- 循环变量;
(3). 实现输入数据和获取数据 -- scanf()函数。
实现代码:
//思路一: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 //输入数据和获取数据: scanf("%d", &n); return 0; }
实现图片:
第二步:
(1). 编写for循环:循环遍历数组中的元素。
(2). 编写for循环中的if条件判断语句:
判断数组遍历的元素是否和输入的n一致,一致则打印相应信息后提前break跳出循环。
实现代码:
//思路一: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 //输入数据和获取数据: scanf("%d", &n); //编写for循环:循环遍历数组中的元素 for (i = 0; i < 10; i++) { //编写for循环中的if条件判断语句: if (arr[i] == n) //循环判断数组遍历的元素是否和n相同 { printf("找到了,该值在数组中对应的下标是:%d ", i); break; //相同则打印相应信息后break跳出循环 } } return 0; }
实现图片:
第三步:
如果for循环遍历数组元素后都没有找到n的话,
再使用一个if条件判断语句,判断是否已遍历完了数组元素,
已遍历完数组且没有找到n,打印对应信息。
实现代码:
//思路一: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 //输入数据和获取数据: scanf("%d", &n); //编写for循环:循环遍历数组中的元素 for (i = 0; i < 10; i++) { //编写for循环中的if条件判断语句: if (arr[i] == n) //循环判断数组遍历的元素是否和n相同 { printf("找到了,该值在数组中对应的下标是:%d ", i); break; //相同则打印相应信息后break跳出循环 } } //如果for循环遍历数组元素后都没有找到n的话: //再使用一个if条件判断语句,判断是否已遍历完了数组元素, //已遍历完数组且没有找到n,打印对应信息。 if (i == 10) //10超过了数组下标,说明数组中没有这个值 { printf("数组中没有该值。 "); } return 0; }
实现图片:
思路一:最终代码和实现效果
最终代码:
//思路一: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 //输入数据和获取数据: scanf("%d", &n); //编写for循环:循环遍历数组中的元素 for (i = 0; i < 10; i++) { //编写for循环中的if条件判断语句: if (arr[i] == n) //循环判断数组遍历的元素是否和n相同 { printf("找到了,该值在数组中对应的下标是:%d ", i); break; //相同则打印相应信息后break跳出循环 } } //如果for循环遍历数组元素后都没有找到n的话: //再使用一个if条件判断语句,判断是否已遍历完了数组元素, //已遍历完数组且没有找到n,打印对应信息。 if (i == 10) //10超过了数组下标,说明数组中没有这个值 { printf("数组中没有该值。 "); } return 0; }
实现效果:
=========================================================================
思路二:二分查找算法(折半查找算法)-- 重点!
(在有序数组查找中效率更高,一次查找就能排除一半的值)
总体思路:
第一步:
(1). 设置初始数组:int arr[]。
(2). 生成相关变量:
int n = 0; -- 存放从键盘输入的要查找的值;
int i = 0; -- 循环变量;
int sz = sizeof(arr) / sizeof(arr[0]) -- 数组元素个数。
(3). 实现输入数据和获取数据 -- scanf()函数。
实现代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); return 0; }
实现图片:
第二步:
(1). 创建 左下标left 和 右下标right。
(2). 设置一个 变量flag,用来设置未找到情况下的处理方式。
实现代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); //创建 左下标 和 右下标: int left = 0; //数组第一个下标是0,左下标 int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标 //设置一个flag: int flag = 0; //用来设置未找到情况下的处理方式 return 0; }
实现图片:
第三步:
(1). 使用while循环结合左右下标进行循环查找。
(2). 确定 中间下标mid 。
实现代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); //创建 左下标 和 右下标: int left = 0; //数组第一个下标是0,左下标 int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标 //设置一个flag: int flag = 0; //用来设置未找到情况下的处理方式 //使用while循环结合左右下标进行循环查找: while (left <= right) //left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断 { //确定中间下标mid: int mid = (left + right) / 2; //进行查找: } return 0; }
实现图片:
第四步:
(1). 循环中找到对应元素的情况处理。
(2). 循环中未找到对应元素的情况处理。
实现代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); //创建 左下标 和 右下标: int left = 0; //数组第一个下标是0,左下标 int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标 //设置一个flag: int flag = 0; //用来设置未找到情况下的处理方式 //使用while循环结合左右下标进行循环查找: while (left <= right) //left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断 { //确定中间下标mid: int mid = (left + right) / 2; //进行查找: //(1).循环中找到对应元素的情况处理: if (arr[mid] == n) { printf("找到了,该值在数组中对应的下标是:%d ", mid); flag = 1; //找到就把flag设为1,说明找到了 break; //找到就break跳出循环 } //(2).循环中未找到对应元素的情况处理: else if (arr[mid] < n) //中间值小于要找的值,排除mid和小于mid左边的值 { left = mid + 1; //因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标 } else //中间值大于要找的值,排除mid和大于mid右边的值 { right = mid - 1; //因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标 } } return 0; }
实现图片:
第五步:
退出循环,说明没有找到对应元素,
看flag的值,打印相应的情况。
实现代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); //创建 左下标 和 右下标: int left = 0; //数组第一个下标是0,左下标 int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标 //设置一个flag: int flag = 0; //用来设置未找到情况下的处理方式 //使用while循环结合左右下标进行循环查找: while (left <= right) //left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断 { //确定中间下标mid: int mid = (left + right) / 2; //进行查找: //(1).循环中找到对应元素的情况处理: if (arr[mid] == n) { printf("找到了,该值在数组中对应的下标是:%d ", mid); flag = 1; //找到就把flag设为1,说明找到了 break; //找到就break跳出循环 } //(2).循环中未找到对应元素的情况处理: else if (arr[mid] < n) //中间值小于要找的值,排除mid和小于mid左边的值 { left = mid + 1; //因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标 } else //中间值大于要找的值,排除mid和大于mid右边的值 { right = mid - 1; //因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标 } } //退出循环,说明没有找到对应元素 if (flag == 0) { printf("没找到 "); } return 0; }
实现图片:
思路二:最终代码和实现效果
最终代码:
//思路二: #include <stdio.h> int main() { //设置初始数组: int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//升序(有序数组) //数组下标: 0 1 2 3 4 5 6 7 8 9 int n = 0; //获取从键盘输入的要查找的值 int i = 0; //循环变量 int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数 //sizeof(arr):计算数组总大小(单位是字节) //sizeof(arr[0]):计算数组中单个元素大小 //用 sizeof(arr) / sizeof(arr[0]) :总大小 除以 单个元素大小 == 元素个数 //输入数据和获取数据: scanf("%d", &n); //创建 左下标 和 右下标: int left = 0; //数组第一个下标是0,左下标 int right = sz - 1;//数组从0开始,用 元素个数-1 得右下标 //设置一个flag: int flag = 0; //用来设置未找到情况下的处理方式 //使用while循环结合左右下标进行循环查找: while (left <= right) //left <= right:说明被左右下标包裹的数组还有值,还有值继续循环判断 { //确定中间下标mid: int mid = (left + right) / 2; //进行查找: //(1).循环中找到对应元素的情况处理: if (arr[mid] == n) { printf("找到了,该值在数组中对应的下标是:%d ", mid); flag = 1; //找到就把flag设为1,说明找到了 break; //找到就break跳出循环 } //(2).循环中未找到对应元素的情况处理: else if (arr[mid] < n) //中间值小于要找的值,排除mid和小于mid左边的值 { left = mid + 1; //因为mid左边(包括mid)都舍弃了,所以 mid+1 刚好就是新的左下标 } else //中间值大于要找的值,排除mid和大于mid右边的值 { right = mid - 1; //因为mid右边(包括mid)都舍弃了,所以 mid-1 刚好就是新的右下标 } } //退出循环,说明没有找到对应元素 if (flag == 0) { printf("没找到 "); } return 0; }
实现效果: