二分法查找元素位置

普通二分法查找元素:

#include <stdio.h>
#include <stdlib.h>

int BinarySearch(int* a, int n, int pos)
{
	int left = 0;
	int right = n-1;
	while (left <= right)
	{
		int mid = left+(right-left)/2;
		if(pos == a[mid])
		{
			return mid;
		}
		else if(pos < a[mid])
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return -1;
}

int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int ret = BinarySearch(arr, 10, 5);
	printf("pos : %d\n", ret);
	system("pause");
	return 0;
}

显示结果:

那如果是查找数组中第一次出现的那个元素,这种方法显然是不可行。

就需要修改一小下下

#include <stdio.h>
#include <stdlib.h>

int BinarySearch(int* a, int n, int pos)
{
	int left = 0;
	int right = n-1;
	while (left <= right)
	{
		int mid = left+(right-left)/2;
		if(pos == a[mid])
		{
			while(mid-1 >= 0 && pos == a[mid-1])
			{
				mid = mid-1;
			}
			return mid;
		}
		else if(pos < a[mid])
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return -1;
}

int main()
{
	int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
	int arr2[13] = {1,2,3,4,5,5,5,5,6,7,8,9,10};
	int ret1 = BinarySearch(arr1, 10, 5);
	int ret2 = BinarySearch(arr2, 10, 5);
	printf("pos1 : %d\n", ret1);
	printf("pos1 : %d\n", ret2);
	system("pause");
	return 0;
}

显示结果:

时间: 2024-08-24 07:07:41

二分法查找元素位置的相关文章

python一个关于二分法查找元素的实现

# coding=utf-8import time def find_ele(alist, ele): if ele < alist[0] or ele > alist[len(alist) - 1]: print("%d not in alist" % ele) return last_index = len(alist) - 1 center_index = last_index // 2 loop_flag = True loop_cout = 0 while loo

二分法查找和快速排序

二分法是分治算法的一种特殊形式,利用分治策略求解时,所需时间取决于分解后子问题的个数.子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是查找数据时经常采用的一种有效的方法. 快速排序的实质也是二分法,下面就写一个快速排序+二分法查找的栗子??: 1 #include<stdio.h> 2 3 4 //快速排序 5 void QuickSort(int * a,int left,int right) 6 { 7 if(left>right) 8 { 9 return; 10

查找元素在list中的位置以及折半查询

问题 查找某个值在list中的位置 解决思路 可以用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在list中的位置 def half_search(lst,value,left,right): length = len(lst) while left<right: middle = (right-left)/2 if lst[middle]>value: right = middle-1 elif

二分法查找(数组元素无序)

问题描述: 一数组,含有一堆无序数据,首先将数据按顺序排列,再用二分法实现某个元素的查找,若找到,返回该元素在数组中的下表,否则,返回不存在提示信息. #include<stdio.h> #include<stdlib.h> int *bubble_sort(int a[],int n)//冒泡排序(将数据升序排列) { int i; int j; int tmp; for(j=0;j<n-1;++j)//n个元素需要排序n-1趟 { for(i=0;i<n-j-1;+

python--通过xpath相对节点位置查找元素(续)

之前写过相对父元素及下一个兄弟元素的方法. 这次补充一下xpath相对节点位置查找元素的所有方法.例子就不举了,自己可以去练练. xpath相对节点查找方法: 1.xpath('./ancestor::*')查找当前节点的所有先辈节点,即父节点或祖父节点 2.xpath('./ancestor-or-self::*')查找当前节点的所有先辈节点以及本身 3.xpath('./attribute::*')获取当前节点的所有属性 4.xpath('./child::*')查找当前节点的所有子节点 5

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

34. 在排序数组中查找元素的第一个和最后一个位置 题目要求用O(logn),明显要用二分. 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = nums.length; int mid = (i + j) / 2; int p = -1; while (i < j) { if (nums[mid] == target) { p = mid; bre

leetcode34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1]------------------ 思路: 这题主要要求时间复

Java中的二分法查找算法

[ 什么是二分查找 ]  二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象, 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.以此类推不断缩小搜索范围. [ 二分查找的条件 ] 二分查找的先决条件是查找的数列必须是有序的. [ 二分查找的优缺点 ] 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查数列为有序,且插入删除困难: 适用场景:不经常变动而查找频繁的有序列表. [ 算法步骤描述 ] ①

iOS 排序算法总结、二分法查找

还有一个:二分插入排序  平均时间O(n2)   稳定 1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] main() { int  a[10],j,i,m; for(j=1;j<10;j++) { m=a[j]; for(i=j-1;i>=0;i--) { if(a[i]<m) b