c语言搜索(顺序,二分,插值)

1.顺序:

简而言之就是将数据从第一个元素向最后一个元素开始遍历,直到找到了就停止,这样的算法明显是效率较低的,但在一些简单的数据规模比较小的问题上可以使用。

2.二分查找:

思想:先确定一个值,对于一个已经排好序的数据表进行查找,每次比较中间值与键值的大小,缩小范围得出答案。例子:设计一个c程序,实现生成一个1~150的随机数,用折半查找找到并计算时间。

```

#include<stdio.h>
#include<time.h>
#include<Windows.h>
int count()
{
    int c;
    c = rand() % 150;
    return c;
}

int main()
{

    int k;
    int bin_search(int a[10], int n);
    int p[10] = { 1,2,5,6,14,15,19,30,34,50 };
    srand((unsigned)time(NULL));
    int start = 1;
    while (start == 1)
    {

        int n = count();
        printf("已上传随机数:%d      正在进行\n ", n);
        system("pause");
        k = bin_search(p,n);
        if (k == 1)
        {
            start = 0;
        }
    }
  
    return 0;
}

int bin_search(int a[10], int n)
{
    int mid = 0, left, right;
    left = 0; right = 9;
    while (left < right)
    {
        mid = (left + right) / 2;
        if (a[mid] > n)
        {
            right = mid - 1;
        }
        else if (a[mid] < n)
        {
            left = mid + 1;
        }
        else
        {
            printf("find it!It has a %d in arr[10]\n", n);
            return 1;
        }
    }
    if (left >= right)
    {
        printf("Not found\n");
    }
    system("pause");
    return 0;
}
```

相对于顺序,二分查找的平均时间复杂度为O(log n) ;效率高了不少,可以处理一些比较大鬼母的数据。

3.插值查找:

时间复杂度为 **O(log log n)**,是基于O( log n )下进行的二分查找.

 - 实际上,插值查找是基于二分查找的优化版本,基本原理是按照数据位置的分布,利用公式预测数据所在的位置,


 - <u>公式:</u>
 mid = low + $\frac{key - data[low]}{data[high] - data[low]}$ * (high - low);
后续步骤和二分查找一样(只是把mid = left + right 换成公式):
 - 若key<key[^mid] 且high!=Mid - 1令high = mid - 1
 - 若key>key[^mid]  且low!= mid + 1;令low = mid + 1;
 - 若key = key[^mid] 找到了。

#include<stdio.h>
#include<time.h>
#include<Windows.h>
int count()
{
    int c;
    c = rand() % 150;
    return c;
}

int main()
{

    int k;
    int bin_search(int a[10], int n);
    int p[10] = { 1,2,5,6,14,15,19,30,34,50 };
    srand((unsigned)time(NULL));
    int start = 1;
    while (start == 1)
    {

        int n = count();
        printf("已上传随机数:%d      正在进行\n ", n);
        system("pause");
        k = bin_search(p,n);
        if (k == 1)
        {
            start = 0;
        }
    }
  
    return 0;
}

int bin_search(int a[10], int n)
{
    int mid = 0; int low = 0; int high = 9;
    while (low < high)
    {
        mid = low + ((n - a[low]) / (a[high] - a[low])) * (high - low);
        if (a[mid] < n && low != mid + 1)
        {
            low = mid + 1;
        }
        else if (a[mid] > n && high != mid - 1)
        {
            high = mid - 1;
        }
        else
        {
            printf("find it!There is a %d in arr[10]\n", n);
            system("pause");
            return 1;
        }
    }
    if (low >= high)
    {
        printf("Not found\n");
    }

    system("pause");
    return 0;
}

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值