博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
查找算法
阅读量:7124 次
发布时间:2019-06-28

本文共 2406 字,大约阅读时间需要 8 分钟。

线性查找(Linear Search):

时间复杂度:O(n)

 

int linerSearch(int * array, int n, int x){    for (int i = 0; i < n; i++)    {        if (array[i] == x)            return i;    }    return -1;}

 


二分查找(Binary Search):

T(n) = T(n/2) + 2

时间复杂度:Θ(log2(n))

如果将数组分为三组进行查找值,所需的比较次数为T(n/3) + 4 => 4 * c * log3n = (4 / log23) * log2n。因为4 / log23大于2,即所需比较次数大于二分发的2 * log2n

 

/* recursive version */int binarySearch(int *array, int left, int right, int x){    if (left <= right)    {        int middle = left + ((right - left) >> 1);if (array[middle] == x)            return middle;        else if (array[middle] > x)            return binarySearch(array, left, middle - 1, x);        else            return binarySearch(array, middle + 1, right, x);    }    return -1;}/* iteration version */int binarySearch(int *array, int left, int right, int x){    int middle;    while (left <= right)    {        middle = left + ((right - left) >> 1);if (array[middle] == x)            return middle;        else if (array[middle] > x)            right = middle - 1;        else            left = middle + 1;    }    return -1;}

 


 插值查找(Interpolation Search) :

适合已排序数组,并且元素的值是均匀分布的

时间复杂度:平均情况为log(log(n))、最坏情况下为 O(n)

int interpolationSearch(int *array, int n, int x){    int left = 0, right = n - 1;    int pos;    while (left <= right && x >= array[left] && x <= array[right])    {        pos = left + (x - array[left]) / (array[right] - array[left]) * (right - left);        if (array[pos] == x)            return pos;        if (array[pos] < x)            left = pos + 1;        else            right = pos - 1;    }    return -1;}

 


 

跳查找(Jump Search):

时间复杂度: O(√n)

int jumpSearch(int *array, int n, int x){    int prev, step, interval;    prev = 0;    step = interval = sqrt(n);    while (array[step] < x)    {        if (step > n - 2)            return -1;        prev = step;                if (step + interval > n - 1)            step = n - 1;        else            step += interval;    }    while (prev < step)    {        prev++;        if (array[prev] == x)            return prev;    }    return -1;}

 


 

指数查找(Exponential Search):

时间复杂度: O(Log n)

对于无边界数组查找非常有用

int exponentialSearch(int *array, int n, int key){    if (array[0] == key)        return 0;    int i = 1;    while (i < n && array[i] < key)    {        i = i << 1;    }    return binarySearch(array, i >> 1, i < n ? i : n - 1, key);}

 

转载于:https://www.cnblogs.com/Lao-zi/p/6536209.html

你可能感兴趣的文章
red hat5安装mysql5.5.25
查看>>
cisco 7200 simulator
查看>>
JAVA WEB搭建 SpringMVC+Spring+hibernate 框架
查看>>
HibernateTemplate中常用的方法
查看>>
clang: error: unknown argument: 'websockets'解决方法
查看>>
Vue.js 特有的一种ajax——axios
查看>>
我的友情链接
查看>>
dos2unix命令 - 将DOS格式文本文件转换成UNIX格式
查看>>
我的友情链接
查看>>
PHP中curl错误号对照表
查看>>
我的学习笔记之js
查看>>
iptables基本概念深入理解
查看>>
smarty前端常用标签
查看>>
Javascript数组小结
查看>>
我的友情链接
查看>>
2019年学习博文分享
查看>>
用python实现九九乘法表
查看>>
Mindscape WebWorkbench 支持Visual Studio 2012 最新破解
查看>>
大型网站技术架构(四)网站的高性能架构
查看>>
Log4j 1使用教程
查看>>