查找基本概念:查询特定元素是否在表中的过程,存在则输出该元素位置,不存在则输出失败标志。
静态查找:只查找,不改变表中数据。
动态查找:既查找,又改变。
顺序查找:(线性查找)
从顺序表的一端开始往后比较,找到返回表中位置,找不到返回-1。
//while循环
static int SeqSearch1(int[] a, int x)
{
int i = 0;
while (i < a.Length && a[i] != x)
i++;
if (i < a.Length && a[i] == x) return i;
else return -1;
}
//for循环
static int SeqSearch2(int[] a, int x)
{
for (int i = 0; i < a.Length; i++)
{
if (a[i] == x)
{
return i;
}
}
return -1;
}
总结:
1、算法简单,且对顺序结构或链表结构均适用;
2、时间效率:O(n),效率太低。
二分查找:(折半查找)
基本思想:在一个排好序的表中,将要找的key与正中元素相比,若key小,则缩小至前半部内查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。
static int BinarySearch(int[] a, int x)
{
int low = 0;//首坐标
int high = a.Length - 1;//尾坐标
int mid;//中坐标
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == x)
return mid;
if (a[mid] > x)//x小于中间值,x位于前半段[low, mid-1]中
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
总结:
1、查找本身的时间效率很高O(nlog2n),但排序本身是一种费时的运算;
2、二分查找只使用于顺序表,且是有序的顺序表,链表无法实现二分查找;
3、二分查找特别使用于那种一经建立就很少改动,而又经常需要查找的线性表。