zoukankan      html  css  js  c++  java
  • 有序的静态查找表的折半(二分)查找算法

    /*折半查找(二分查找)
    解题步骤:
    1.将有序表(升序)存储在数组中。
    2.定义三个指针low,high,mid。起初指针low指向了数组的首元素,指针high指向
    数组的最后一个元素,指针mid指向low+(high-low)/2元素的地址。
    下述分析情况:
    0,1,2,3,4,5,6,7,8,9,10 奇数个数的情况: m所指向的元素的两边的元素相等
    l         m         h
    h-1/2=5
    l+5=5
    0,1,2,3,4,5,6,7,8,9 偶数个数的情况:m所指向的元素的右边的元素的个数比左边的元素的个数多一个
    l       m          h
    h-l/2=4;
    l+4=4
    3.将mid所指向的元素的值和要查找的元素的值key(key为可唯一标识一条记录的关键字)比较,若相等,
    mid所指向的元素的为要查找的记录,若mid所指向的元素的值大于key,故可得出
    推论key元素在mid所指向的元素的左边,因此,将指针high指向指针mid-1指向的位置,
    令指针mid指向low+(high-low)/2所指向的位置,若若mid所指向的元素的值小于key,故可得出
    推论key元素在mid所指向的元素的右边,因此,将指针low指向指针mid+1指向的位置,令指针mid指向
    low+(high-low)/2所指向的位置。
    4重复3,直到low和mid指向的位置相等时,若mid所指向的元素的值不等于key可知道不存在查找的记录
    
    */
    
    #include <stdio.h>
    #define LEN 11
     int * search(int *ptr,int size,int key);
    int main(void)
    {
    	int arr[LEN]={5,13,19,21,37,56,64,75,80,88,92};
    
       if(search(arr,LEN,92)==NULL)
    	   printf("no record\n");
       else
    	printf("%d\n",*search(arr,LEN,92));
    	
    
    
    	return 0;
    }
    //将指针high指向指针mid-1指向的位置
     int * search(int *ptr,int size,int key)
     {
    	 int *low,*high,*mid;
    	 low=ptr;
         high=ptr+size-1;
    	 mid=low+(high-low)/2;
    	 while(low<=high)
    	 {
    		 if(*mid==key)
    			return mid;
               else if(*mid>key) { high=mid-1; mid=low+(high-low)/2;//high+low 指针的相加是不允许的因此mid=(high+low)/2错误表示方法 } else { low=mid+1; mid=low+(high-low)/2;//词句重复出现两句,因此可将其放到return mid;语句之后 } } return NULL; } /*将指针high指向指针mid指向的位置的情况 int * search(int *ptr,int size,int key) { int *low,*high,*mid; low=ptr; high=ptr+size-1; mid=low+(high-low)/2; do { if(*mid==key) return mid; else if(*mid>key) { high=mid; mid=low+(high-low)/2; } else { low=mid; mid=low+(high-low)/2; } if(*mid==key) return mid; }while(mid!=low); if(*high==key) return high; return NULL; } */

      

  • 相关阅读:
    Spring Boot → 08:嵌入式Servlet容器自定义
    Spring Boot → 09:使用外置Servlet容器_tomcat9.0
    Spring Boot → 07:错误处理机制
    Spring Boot → 06:项目实战-账单管理系统
    Spring Boot → 05:Web开发
    zzz Objective-C的消息传递机制
    Objective-C中的SEL、IMP和Class类型(转)
    zzzObjective-C的动态特性
    zzz KVC/KVO原理详解及编程指南
    zzzzz iOS绘图教程
  • 原文地址:https://www.cnblogs.com/jzhao/p/3065815.html
Copyright © 2011-2022 走看看