luciferzf 发表于 2017-8-22 16:19:36

《数据结构与算法》——简单查找

二分查找法:将按大小顺序排列好的数字存放在数组,我们将low,high分别初始化为0和数组下标最大值,mid=(low+high)/2,不断的比较mid指向的元素和待查找元素key的值,若mid>key,则使high=mid,重复之前步骤;反正low=mid,直至key与mid指向元素相等,或low=high。
插值查找:原理与二分查找类似,但是插值查找利用比例来找到mid的下一个位置,即
mid=low+(key-a)/(a-key)*(high-low),来确定下一个mid,进行递归或者迭代。
斐波那契查找:该算法将数组元素不断地分为两个斐波那契数,如大小为13的数组则被分为5和8两个部分,然后比较key与a,以此不断地进行递归或者迭代,直至low=high或找到目标key的下标。当数组元素个数不足时,用最大值补足


#include<cstdio>
#include<cstdlib>
#include<time.h>
#include<iostream>
using namespace std;

class LIST
{
public:
        char name;
        int score,ID;
};

int key;


int Input(LIST *&s)
{
        cout << "input the numbers of students;";
        int n;
        cin >> n;
        s = new LIST;
        printf("input the student's name,ID numbers,score:\n");
        for (int i = 0; i < n; i++)
        {
                cin >> (s+i)->ID >> (s + i)->name >> (s + i)->score;
        }
        return n;
}

void Binary_search(LIST *s,int low,int high)
{
        int mid = (high + low) / 2;
        int k = (s - mid)->ID;
        if (low == high)
        {
                cout << "no such student" << endl;
                return;
        }
        if (key < (s - mid)->ID)
        {
                cout << (s - mid)->ID << endl;
                Binary_search(s, mid+1, high);
        }
        else if (key > (s - mid)->ID)
        {
                cout << (s - mid)->ID << endl;
                Binary_search(s, low, mid);
        }
        else if (key == (s - mid)->ID)
        {
                cout << "ID:" << (s + mid)->ID << "name:" << (s + mid)->name << "score:" << (s + mid)->score << endl;
        }
}

void Inter_search(LIST *s, int low, int high)
{
        int mid = low + (key - (s + low)->ID) / ((s + high)->ID - (s + low)->ID + 1);
        if (low == high)
        {
                cout << "no such student" << endl;
                return;
        }
        if (key > (s + mid)->ID)
        {
                Binary_search(s, mid, high);
        }
        else if (key < (s + mid)->ID)
        {
                Binary_search(s, low, mid);
        }
        else if (key == (s + mid)->ID)
        {
                cout << "ID:" << (s + mid)->ID << "name:" << (s + mid)->name << "score:" << (s + mid)->score << endl;
        }
}
int Fabonacci(int n)
{
        int a = 1, b = 1;
        int result = 1;
        while (1)
        {
                if (n > result&&n < a + b)
                {
                        return a ;
                }
                else if(n>a+b)
                {
                        result = a + b;
                        b = a;
                        a = result;
                }
                else if (n == a + b)
                {
                        return result;
                }
                else if (n == result)
                {
                        return b;
                }
        }
}
void Fabonacci_search(LIST *s, int low,int high)
{
        int mid = Fabonacci(high-low)-1;
        //判断是否有不存在的可能
        if (key < (s + mid + low )->ID)
        {
                Fabonacci_search(s, low, mid);
        }
        else if(key > (s + mid + low)->ID)
        {
                Fabonacci_search(s, mid+1, high);
        }
        else if (key == (s + mid + low )->ID)
        {
                cout << "ID:" << (s + mid )->ID << " name:" << (s + mid )->name << " score:" << (s + mid )->score << endl;
        }
}

int main()
{
        LIST *s;
        int n;
        clock_t start,end;
        n=Input(s);
        int choice=1;
        cout << "input the target ID number:";
        cin >> key;
        while (choice)
        {
                printf("1——>二分查找\n2——>差值查找\n3——>斐波那契查找\n0——>结束程序\n");
                printf("input your choice:");
                scanf_s("%d", &choice);
                switch(choice)
                {
                case 1:
                        start = clock();
                        Binary_search(s,0,n);
                        end = clock();
                        cout << "used time is " << (double)(end - start)/ CLOCKS_PER_SEC << endl;
                        break;
                case 2:
                        start = clock();
                        Inter_search(s,0,n);
                        end = clock();
                        cout << "used time is " << (double)(end - start) / CLOCKS_PER_SEC << endl;
                        break;
                case 3:
                        start = clock();
                        Fabonacci_search(s,0,n);
                        end = clock();
                        cout << "used time is " << (double)(end - start) / CLOCKS_PER_SEC << endl;
                        break;
                case 0:
                        break;
                default:
                        cout << "Wrong!"<<endl;
                        break;

                }
        }
        system("PAUSE");
}
页: [1]
查看完整版本: 《数据结构与算法》——简单查找