查找算法


1
#include "stdio.h" 2 #include "stdlib.h" 3 #include "io.h" 4 #include "math.h" 5 #include "time.h" 6 7 #define OK 1 8 #define ERROR 0 9 #define TRUE 1 10 #define FALSE 0 11 #define MAXSIZE 100 /* 存储空间初始分配量 */ 12 13 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 14 int F[100]; /* 斐波那契数列 */ 15 16 /* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */ 17 int Sequential_Search( int *a, int n, int key ) 18 { 19 for(int i=1; i<=n; i++) 20 { 21 if (a[i] == key) 22 return i; 23 } 24 25 return 0; 26 } 27 28 /* 有哨兵顺序查找 */ 29 int Sequential_Search2( int *a, int n, int key ) 30 { 31 a[0] = key; 32 int i = n; 33 while( a[i] != key ) 34 { 35 i--; 36 } 37 return i; 38 } 39 40 /* 折半查找 */ 41 int Binary_Search(int *a,int n,int key) 42 { 43 int low, high, mid; 44 low = 1; /* 定义最低下标为记录首位 */ 45 high = n; /* 定义最高下标为记录末位 */ 46 47 while(low <= high) 48 { 49 mid = (low+high)/2; /* 折半 */ 50 51 if (key < a[mid]) /* 若查找值比中值小 */ 52 high = mid-1; /* 最高下标调整到中位下标小一位 */ 53 else if (key > a[mid]) /* 若查找值比中值大 */ 54 low = mid+1; /* 最低下标调整到中位下标大一位 */ 55 else 56 { 57 return mid; /* 若相等则说明mid即为查找到的位置 */ 58 } 59 60 } 61 return 0; 62 } 63 64 /* 插值查找 */ 65 int Interpolation_Search( int *a, int n, int key ) 66 { 67 int low, high, mid; 68 low = 1; /* 定义最低下标为记录首位 */ 69 high = n; /* 定义最高下标为记录末位 */ 70 71 while(low <= high) 72 { 73 mid = low + (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */ 74 75 if (key < a[mid]) /* 若查找值比插值小 */ 76 high = mid-1; /* 最高下标调整到插值下标小一位 */ 77 else if (key>a[mid]) /* 若查找值比插值大 */ 78 low = mid+1; /* 最低下标调整到插值下标大一位 */ 79 else 80 return mid; /* 若相等则说明mid即为查找到的位置 */ 81 } 82 return 0; 83 } 84 140 141 int main(void) 142 { 143 144 int a[MAXSIZE+1],i,result; 145 int arr[MAXSIZE]={0,1,16,24,35,47,59,62,73,88,99}; 146 147 148 for(i=0;i<=MAXSIZE;i++) 149 { 150 a[i]=i; 151 } 152 result=Sequential_Search(a,MAXSIZE,MAXSIZE); 153 printf("Sequential_Search:%d \n",result); 154 155 result=Sequential_Search2(a,MAXSIZE,1); 156 printf("Sequential_Search2:%d \n",result); 157 158 result=Binary_Search(arr,10,62); 159 printf("Binary_Search:%d \n",result); 160 161 result=Interpolation_Search(arr,10,62); 162 printf("Interpolation_Search:%d \n",result); 163 164 165 F[0] = 0; 166 F[1] = 1; 167 for(i = 2; i < 100; i++) 168 { 169 F[i] = F[i-1] + F[i-2]; 170 } 171 result = Fibonacci_Search( arr, 10, 62 ); 172 printf("Fibonacci_Search:%d \n", result); 173 174 system("pause"); 175 return 0; 176 }

 

四:斐波那契(Fibonacci)查找

查找思想:
    设查找表中的记录数比某个Fibonacci数小1,即设n=F(j)-1。
    用Low、High和Mid表示待查找区间的下界、上界和分割位置,初值为Low=1,High=n。
    ⑴ 取分割位置Mid:Mid = F(j-1) ;
    ⑵ 比较分割位置记录的关键字与给定的 Key 值:
      ①  相等: 查找成功;
      ②  大于:待查记录在区间的前半段(区间长度为F(j-1)-1),修改上界指针: High=Mid-1,转⑴ ;
      ③  小于:待查记录在区间的后半段(区间长度为F(j-2)-1),修改下界指针:Low=Mid+1,转⑴ ;
    直到越界(Low > High),查找失败。

斐波那契查找的核心:
1)当key=a[mid]时,查找成功;
2)当key<a[mid]时,新的查找范围是第low个到第mid-1个,此时范围个数为F[k-1] - 1个,
    即数组左边的长度,所以要在[low, F[k-1]-1]范围内查找;
3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,
    即数组右边的长度,所以要在[F[k-2]-1]范围内查找。


以下为Fibonacci查找的核心程序:

int Fibonacci_Search( int *a, int n, int key )
{
    int low,high,mid,i,k=0;
    low  = 1;    /* 定义最低下标为记录首位 */
    high = n;    /* 定义最高下标为记录末位 */

    while(n > F[k]-1)
        k++;
        // 将多余的补充为与最后一个一样的元素
    for (i=n; i<F[k]-1; i++)
        a[i] = a[n];

    while(low <= high)
    {
        mid = low + F[k-1]-1;    // 根据斐波那契数列进行黄金分割 

        if (key < a[mid])
        {
            high = mid-1;        
            k = k-1;
        }
        else if (key > a[mid])
        {
            low = mid+1;        
            k = k-2;
        }
        else
        {
            if (mid <= n)
                return mid;        /* 若相等则说明mid即为查找到的位置 */
            else 
                return n;
        }
    }
    return 0;
}

 

posted on 2014-08-30 20:13  何双泉_设计之美  阅读(147)  评论(0)    收藏  举报