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

//二分法的函数部分;
//将要找的数字与中间的数字进行比较,比较后将下标移动
//比较部分是数字,改变部分是下标

#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;//中间下标的计算
if (arr[mid]>key)//将想要找的数与中间数作比较
{
right = mid-1;//改变下标;下同
}
else if (arr[mid] <key)
{
left = mid+1;
}
else
{
return mid;//判断完后将中间下标对应的数字筛选出来
}
}
return -1;

}

int main()
{
int arr[] = { 2, 3, 5, 8, 6, 7, 9, 1, 11, 23 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int i;
again:
scanf("%d/n", &i);
int ret=Search(arr,i, left, right);//函数部分
{
if (-1==ret)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d\n",ret);
}
}
goto again;
system("pause");
return 0;
}

原文地址:https://blog.51cto.com/14239789/2368292

时间: 2024-10-10 02:28:34

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

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

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

思路:对数组中的数字进行查找并与目标数字进行比较,一样则可以找到,不一样则没有. 方法一:在有序的数组中查找一个数字,可以用一个循环的方式将每一个数字依次查找然后挑出所求数字. 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)

二分法计算有序数组中数字出现的次数

1. 问题描述 在给定的一个已经排好序的数组中,找出指定数字出现的次数.例如数组[1,2,3,4,4,4,4,6,8,9]中4出现的次数为4次. 2. 思路与方法 此问题可以在二分法的基础上进行改进.假设数组a为递增的数列,需要查找的数字为num,可以分别查找num在数组a中出现的起始位置和最后一次的位置,通过二者的差计算出数字num在数组a中出现的次数. c++代码如下: #include <stdio.h> #include <iostream> #include <st

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

非递归法: #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 

#C语言#二分法查找有序数组

C语言的二分法,想必很多朋友都在初学时是一个难啃的骨头,因为这是必须掌握的最基础的一种算法.在这里我分享一下这个简单的#二分法#查找有序数组 #include<stdio.h> int binary_search(int arr[],int key, int left, int right) { while (left <= right) { int mid = left + (right - left) / 2; if (a[mid]<key) { left = mid + 1;

LeetCode 26 Remove Duplicates from Sorted Array (移除有序数组中重复数字)

题目链接: https://leetcode.com/problems/remove-duplicates-from-sorted-array/?tab=Description 从有序数组中移除重复数字,并且返回不重复数字的个数 遍历操作: 可以使用新的for循环 for (int n : nums){} 每次进行对比,并且更新第一个遇到不相等的元素的下标为i 对数组进行重新赋值操作 当数组长度大于1时,ans初值为1,当数组长度为0时,返回0 参考代码 : package leetcode_5

找到轮转后的有序数组中第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;

找轮转后的有序数组中第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[r]) { l = mid + 1; }

使用二分查找向一个有序数组中插入一个数据

折半查找法找到一个元素在数组中的下标 * @param arr 数组 * @param key 要查找的元素 * @return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置 * 如:[1,4,6,7,10,11,15],查找8在数组中的位置,如果存在则返1,不存在则返回在7这个下标+1的这个位置上, 也就是说在返回10所在位置上的下标 */ public static int arrayIndexOf(int[] array,int key) { int min,