`

折半查找

阅读更多

    通过折半查找的方法 进行查找元素的时候:

 

必须要保证要查找的元素集合collection是有序的。然后想象改需要查找的集合是有头又尾的,头为top,尾bottom.

 

(1)先把要查找的目标元素target,同集合的中间元素mid进行比较。

(2)如果target>collection[mid]则表示,目标元素在集合的右半部分中,因此【top=mid+1】。

(3)否则目标元素在左半部分,因此【bottom=mid-1】。

(4)然后重复这个过程,直到target==data[mid]--->>元素找到,或者top>bottom,元素未找到。

 

 

 

 

   JAVA代码实现(非递归):

public class BiFind {
	// 假如data[]数组是从小到大的
	public static boolean find(int[] data, int target) {
		int top = 0;
		int bottom = data.length - 1;
		while (top <= bottom) {
			int mid = (top + bottom) / 2;
			if (target < data[mid]) {
				bottom = mid - 1;

			} else if (target>data[mid]) {
				top = mid + 1;

			} else {
				return true;

			}

		}

		return false;

	}

	public static void main(String[] args) {
		int[] data = new int[] { 1, 2, 3, 4, 5,5,5,5,6, 6, 6,11111 };
		System.out.println(find(data, 5));

	}
}

 

 

 

  C代码实现【VC2005运行成功】:

 

     改用C语言实现了一下,先对无序数组进行冒泡排序(bubble sort),然后再进行二分查找(递归实现)。

 

#include "stdafx.h"

int binarySearch(int target,int start,int end,int* arr);
void bubbleSort(int* arr,int length);
int main()
{
	int a[]={1,233,3,4,5,6,337,811,9,10}	;
    int length = sizeof(a)/sizeof(int);
	int target = 10;
	bubbleSort(a,length);
	
	if(binarySearch(target,0,length-1,a)>0){
	  printf("target %d is found",target);
	}
 	return 0;
}

int binarySearch(int target,int start,int end,int* arr){
   int mid = (start+end)/2;
  
   if(start>end) return -1;

   if(start<=end){
	   if(target>arr[mid]){
	    
		return binarySearch(target,mid+1,end,arr);
	   }else if(target<arr[mid]){
	     
		 return binarySearch(target,start,mid-1,arr);
	   }else{
	     return mid;
	   }

   
   }

}

void bubbleSort(int* arr,int length){

	for(int i=0;i<length;i++){
	   bool exchange = false;
       //小心指针越界,j<length-1   
	   for(int j=0;j<length-1;j++){
	      int temp = 0;	
		  if(*(arr+j)>*(arr+j+1)){
		     temp=*(arr+j);
			 *(arr+j) = *(arr+j+1);
			 *(arr+j+1) = temp;
		       
		     exchange =true;
		  }  

		 


		  
		
		  
	   
	   }

	 if(!exchange) {
			  break;
		  }
	}
	


}
 

 

 

分享到:
评论
1 楼 tomoya 2010-12-03  
int mid = (top + bottom) / 2; 容易越界
可以这样:

int mid = bottom+ ((top - bottom) / 2);
或者
int mid = (bottom+ top ) >>> 1;

相关推荐

    折半查找(二分查找)折半查找(二分查找)折半查找(二分查找)

    "折半查找(二分查找)" 折半查找(二分查找)是一种高效的查找算法,对于顺序存储的有序表,可以快速地找到指定的关键字记录。该算法的基本思想是,每次比较给定值 K 与中间位置记录的关键字值,并根据比较结果...

    C语言实现顺序表的顺序查找和折半查找

    C语言实现顺序表的顺序查找和折半查找 在计算机科学中,查找是指在一组数据中找到特定元素的过程。顺序表是一种基本的数据结构,在实际应用中非常常见。因此,学习如何在顺序表中实现查找是非常重要的。下面,我们...

    折半查找的递归算法

    ### 折半查找的递归算法 #### 一、引言 折半查找(也称为二分查找)是一种高效的查找算法,适用于有序数组。通过不断将查找区间对半分割,可以快速定位目标值的位置,时间复杂度为O(log n),其中n是数组长度。本文...

    数据结构--折半查找

    数据结构习题---折半查找代码 void BinInsert(int A[],int &n,int item) { int j,low=1,high=n,mid; while(low) { /* 利用折半查找法查找合适位置*/ mid=(low+high)/2; /* 计算当前查找部分的中间位置*/ if...

    折半查找算法在顺序表中插入一个元素讲解.pdf

    折半查找算法在顺序表中插入一个元素讲解 折半查找算法是一种常用的查找算法,它可以在已经排好序的顺序表中快速地找到某个元素。下面我们来详细讲解折半查找算法在顺序表中插入一个元素的过程。 折半查找算法的...

    C#Windows窗体模拟折半查找程序

    **C# Windows窗体模拟折半查找程序** 在C#编程环境中,开发Windows窗体应用程序是一种常见的实践,它允许用户通过图形用户界面(GUI)与软件进行交互。在这个特定的项目中,我们关注的是实现一个模拟折半查找算法的...

    二叉排序树和折半查找

    二叉排序树在查找过程中类似于连续的折半查找,只不过是在树结构中进行,而折半查找是在数组中进行。 8. **应用**: 二叉排序树广泛用于数据库索引、文件系统和虚拟内存管理等场景,而折半查找常用于大量有序数据...

    汇编课程设计 实现折半查找

    在本汇编课程设计中,我们关注的主题是“实现折半查找”,这是一项在计算机科学领域内基础且重要的算法技术。折半查找,也称为二分查找,是一种在有序数组中搜索特定元素的有效方法。其基本思想是通过不断将搜索范围...

    静态查找表。实现有序表的折半查找算法

    ### 静态查找表与折半查找算法 在计算机科学中,静态查找表是一种用于存储数据并能够高效检索特定元素的数据结构。本篇文章将详细解释如何实现一个静态查找表,并利用折半查找算法(也称二分查找算法)来查询表中的...

    折半查找算法及matlab代码实现

    ### 折半查找算法及其MATLAB实现 #### 折半查找算法原理 折半查找算法是一种高效的搜索技术,尤其适用于已经排序的数组。该算法的基本思想是通过不断将搜索范围减半来查找目标值,因此也被称为二分查找。与线性...

    顺序查找和折半查找在10个元素中查找20

    在给定的标题“顺序查找和折半查找在10个元素中查找20”中,我们关注的是两种基本的查找算法:顺序查找(Sequential Search)和折半查找(Binary Search)。这些算法在处理有序或无序数据集时各有优势,下面我们将...

    折半查找算法的改进和程序实现

    折半查找算法是一种在有序数组中寻找特定元素的搜索算法,其基本思想是将数组分为两半,通过比较中间元素和目标值来缩小搜索范围。然而,传统的折半查找在某些情况下并不一定是效率最高的方法。通过对查找算法的改进...

    折半查找 c语言函数

    折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是通过比较中间元素和目标值,将搜索范围不断缩小为一半,直到找到目标值或者搜索范围为空。这种方法相对于线性查找有显著的效率...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    快速排序和折半查找是两种在计算机科学中广泛使用的算法,尤其在数据处理和搜索操作中扮演着重要角色。在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个...

    数据结构实验 折半查找的有关操作

    数据结构实验中的“折半查找”是一种高效的搜索算法,特别适用于已排序的数据集合。这个实验旨在帮助学生理解和掌握如何用C语言实现这种算法,以及在顺序存储结构上进行基本的查找表操作。 实验目的分为两个方面: ...

    顺序查找+折半查找

    这里我们主要探讨两个经典的查找算法:顺序查找和折半查找,它们都是在有序或无序数据集合中寻找特定元素的方法。 **顺序查找**,也称为线性查找,是一种基本的查找算法,适用于任何类型的数据结构,尤其是链表和...

    折半查找的简单C语言算法

    使用折半查找,输入一个整数,查找是否在数组中,如在给出下标,否则-1

    利用折半查找整数m在数组中的位置。

    由N个有序整数组成的数列已放在一维数组中,给定程序MODI1.C中函数fun的功能是:利用折半查找整数m在数组中的位置。若找到,返回其下标值;反之,返回-1。 折半查找的基本算法是:每次查找前先确定数组中待查的范围...

    数据结构实验——折半查找

    折半查找是数据结构中,查找的其中一种。此资源不但包括折半查找的算法,还包括帮助其运行的其他代码,可直接运行以实现折半查找。注:输入数据时,要将数据从大到小依次输入,方可实现折半查找。

    查找问题(顺序查找法, 折半查找法,)基本思想

    查找问题(顺序查找法, 折半查找法,)基本思想:一列数放在数组a(1)---a(n)中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a...

Global site tag (gtag.js) - Google Analytics