写代码可以在整型有序数组中查找想要的数字

思路:对数组中的数字进行查找并与目标数字进行比较,一样则可以找到,不一样则没有。

方法一:在有序的数组中查找一个数字,可以用一个循环的方式将每一个数字依次查找然后挑出所求数字。

 1 #include<stdio.h>
 2 #define _CRT_SECURE_NO_WARNINGS
 3
 4 int Find_num(int a[], int size, int num)
 5 {
 6     for (int i = 0;i < size; i++)
 7     {
 8         if (a[i] == num)
 9         {
10             return i;
11         }
12     }
13     return -1;
14 }
15
16 int main()
17 {
18     int num = 0;
19     printf("请输入想要查询的数字:\n");
20     scanf("%d",&num);
21
22     int a[8] = { 1,2,3,4,5,6,7,8 };
23     int size = sizeof(a) / sizeof(a[0]);
24     int find_num = Find_num(a, size, num);
25     if (find_num == -1)
26     {
27         printf("没有找到!\n");
28     }
29     else
30     {
31         printf("找到了!\n");
32         printf("%d", find_num);
33     }
34
35     return 0;
36 }

方法二:因为是有序的数组,数组里的数字会按规律排列,可以利用二分法的方法,将数组分为左右两块,从中间开始和所求数字比较大小,如果所求数字在左区间则继续划分左面的区间,直到找到目标数字。这样的优点是每次可以只查找一半,不用将数组里的内容都查找完,大大提高了效率。

用二分法进行查找的时候要注意这里区间变换时,left需要+1;right则需要-1.

 1 #include<stdio.h>
 2 #define _CRT_SECURE_NO_WARNINGS
 3
 4 int Find_num(int a[],int size,int num)
 5 {
 6     int left = 0;
 7     int right = size - 1;
 8     while (left <= right)
 9     {
10         int i = (left + right) / 2;
11         if (a[i] < num)
12         {
13             left = i + 1;
14             continue;
15         }
16         else if (a[i] > num)
17         {
18             right = i -1;
19             continue;
20         }
21         else
22         {
23             return i;
24         }
25     }
26     return -1;
27 }
28
29 int main()
30 {
31     int num = 0;
32     printf("请输入想要查询的数字:\n");
33     scanf("%d", &num);
34
35     int a[8] = { 1,2,3,4,5,6,7,8 };
36     int size = sizeof(a) / sizeof(a[0]);
37     int find_num = Find_num(a, size, num);
38     if (find_num == -1)
39     {
40         printf("没有找到!\n");
41     }
42     else
43     {
44         printf("找到了!\n");
45         printf("%d", find_num);
46     }
47
48     return 0;
49 }

原文地址:https://www.cnblogs.com/cuckoo-/p/10312149.html

时间: 2024-07-30 11:35:25

写代码可以在整型有序数组中查找想要的数字的相关文章

C语言编程 在整型有序数组中查找想要的数字并且返回下标

遇到"有序"数组中查找元素类的题,优先考虑折半查找(二分查找) 做法核心是利用所定义的下标left和right与mid(由计算得来)下标的比较来逐渐缩短查找范围,达到一个阈值后即为找到. 源代码如下: #include<stdio.h> #include<stdlib.h> int search(int a[], int x, int left, int right)//定义二分查找函数 { while (left <= right) { int mid

折半查找------在一个升序的有序数组中查找某个具体的数字

非递归法: #include <stdio.h> #include <stdlib.h> #define number 6  int binsearch(int x, int *arr, int left, int right); int main() { int x = 0, inter = 0; int arr[number] = { 1, 5, 12, 36, 45, 98 }; /* * printf("请输入可查找到的数:> "); * for 

如何用二分法在有序数组中找到你想要的数字

//二分法的函数部分://将要找的数字与中间的数字进行比较,比较后将下标移动//比较部分是数字,改变部分是下标 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h> int Search(int arr[], int key,int left, int right){while (left <= right){int mid =left + (right-left) / 2;//中间下标的计算

(算法)旋转有序数组中查找某个数

题目: 假设有个有序数组在某个位置旋转,得到新的数组,即为旋转有序数组.如:(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). 现给定一个这样的数组,在数组中查找某个数.如果找到,返回下标,否则返回-1: 思路: 思路1: 考虑一个旋转有序数组的特点:前面部分是递增的,后面部分也是递增的,即先后两部分都为递增有序数组,因此可以用二分查找来做. 假设数组为A,下标从left到right,查找的数字为target,那么mid=(left+((right

LeetCode 34 Search for a Range (有序数组中查找给定数字的起止下标)

题目链接: https://leetcode.com/problems/search-for-a-range/?tab=Description Problem: 在已知递减排序的数组中,查找到给定数字的起止下标 采用两遍扫描: 第一遍扫描得到给定数字的起始下标,(从下标i==0开始到nums.lenght-1) 第二遍扫描从第一遍扫描得到的下标开始进行扫描 参考代码: package leetcode_50; /*** * * @author pengfei_zheng * 数组中找到targe

二分查找思想寻找有序数组中查找最小值

思想:循环有序数组最大的特点是利用二分查找时,有一边总是有序的,利用这个特点,利用value存储历史最小值 当左边有序,则用A[low]与value比较即可得出当前左边的最小值,然后跳转到右边看是否存在更小的: 如果右边有序,则用A[mid]与value比较,得出右边的最小值,然后跳转到左边查看是否有更小的. 算法复杂度为O(logn) 代码如下: #include<iostream> #include<stdio.h> #include<assert.h> using

【算法练习题】力扣练习题——数组(6): 在有序数组中查找元素存在的范围

原题说明:给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. 原题链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 题目分析: 这道题目当然也是用二分查找来解题.经过上道题的教训,这次我详细考察了各个

两个有序数组中查找第K大数

题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字. 方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复杂度是O(m+n).空间复杂度也是O(M+n). 这个方法其实没有考虑到有第K大数为两个相同数字的情况. 方法二: 这里需要两个前提条件, 1.如果K是中位数,则(M+n)是奇数还是偶数是有关系的.如果是奇数,那么中位数唯一,如果是偶数就有两个中位数,可以随便取一个. 2.如果找到的第K大数是x,假如在

找到轮转后的有序数组中第K小的数

我们可以通过二分查找法,在log(n)的时间内找到最小数的在数组中的位置,然后通过偏移来快速定位任意第K个数. 此处假设数组中没有相同的数,原排列顺序是递增排列. 在轮转后的有序数组中查找最小数的算法如下: int findIndexOfMin(int num[],int n) { int l = 0; int r = n-1; while(l <= r) { int mid = l + (r - l) / 2; if (num[mid] > num[size]) { l = mid + 1;