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;
}