【1】查找概论

查找表是由同一类型是数据元素(或记录)构成的集合。

关键字是数据元素中某个数据项的值,又称为键值。

若此关键字可以唯一标识一个记录,则称此关键字为主关键字。

查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找分为两类:静态查找表和动态查找表。

静态查找表:只作查找操作的查找表。主要操作:

(1)查询某个“特定的”数据元素是否在查找表中。

(2)检索某个“特定的”数据元素和各种属性。

动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经已经存在的某个数据元素。 主要操作:

(1)查找时插入数据元素。

(2)查找时删除数据元素。

好吧!两者的区别: 静态查找表只负责查找任务,返回查找结果。

而动态查找表不仅仅负责查找,而且当它发现查找不存在时会在表中插入元素(那也就意味着第二次肯定可以查找成功)

【2】顺序表查找

顺序表查找又称为线性查找,是最基本的查找技术。 它的查找思路是:

逐个遍历记录,用记录的关键字和给定的值比较:

若相等,则查找成功,找到所查记录; 反之,则查找不成功。

顺序表查找算法代码如下:

查找(顺序表&有序表)

对于这种查找算法,查找成功最好就是第一个位置找到,时间复杂度为O(1)。

最坏情况是最后一个位置才找到,需要n次比较,时间复杂度为O(n) 显然,n越大,效率越低下。

【3】有序表查找

所谓有序表,是指线性表的数据有序排列。

(1)折半查找

关于这个算法不做赘述,代码如下:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 // 折半查找算法(二分查找) 
 5 int Binary_Search(int* a,int n,int key)
 6 {
 7     int low = 1, high = n, mid = 0;  // 初始化
 8     while (low <= high)    // 注意理解这里还有等于条件
 9     {
10         mid = (low + high)/2; // 折半
11         if (key < a[mid])
12             high = mid -1;    // 最高小标调整到中位小一位
13         else if (key > a[mid])
14             low = mid + 1;    // 最低下标调整到中位大一位
15         else
16             return mid;         // 相等说明即是
17     }
18     return 0;
19 }
20 
21 void  main ()
22 {
23     int a[11] = {0,9,23,45,65,88,90,96,100,124,210};
24     int n = Binary_Search(a,10, 9);
25     if (n != 0)
26         cout << "Yes:" << n << endl;
27     else
28         cout << "No:" << endl;
29 }
View Code

相关文章: