鱼C论坛

 找回密码
 立即注册
查看: 2840|回复: 0

[学习笔记] 黄金分割算法

[复制链接]
发表于 2018-3-17 14:38:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;
typedef int Status;
int F[]={0,1,1,2,3,5,8,13,21,34,55,89};
Status Fibonaci_search(int a[],int n,int key){
    int left = 0;
    int right = n , mid , k = 0, i;
    ///while循环是用来找出K的数值,并且如果F【6】<n<F[7],则k等于7
    while( n > F[k] - 1)
    {
        k++;
    }
    ///下面是为了使a数组的长度等于F【k】,然后将后面新加的数组补全,并且等于都等于a[n]
    for(i = n; i < F[k] - 1; i++)
    {
        a[i] = a[n];
    }
    while(left <= right)
    {
        mid = left + F[k - 1] -1 ;///这是黄金分割的公式
        if( key == a[mid])
        {
            if(mid <= n)
            {
                return mid ;
            }else{
                return n;
            }

        }else if (key < a[mid])
        {
            right = mid - 1;
            k = k -1; ///前半部分的长度是F【k-1】
        }else if ( key > a[mid])
        {
            left = mid + 1;
            k = k - 2 ;///此处减2的原因是因为后半部分的长度是F【k-2】
        }
    }
    return 0;
}
int main() {
    int key ,n = 8;
    cout<<"输入要寻找的数值"<<endl;
    cin>>key;
    int a[n] = {1,3,5,6,7,9,12,24};
    int m = Fibonaci_search(a, n,key);
    if(m)
    {
        cout<<"查找成功"<<endl;
    }
    else{
        cout<<"查找不成功"<<endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表