概念:
查找就是根據給定的某個值,在查找表中確定一個關鍵字等於給定值的數據元素。
主要查找算法:
- 順序表查找:順序表查找屬於無序查找,從第一個關鍵字開始,逐個關鍵字進行比較,查找給定關鍵字;
- 二分查找:又稱折半查找,屬於有序查找,在進行查找之前需要對查找表進行排序,使查找表有序,這樣能方便快速查找;
- 插值查找:是對二分查找的優化,通過將數據內容與中值關係進行聯繫,加快查找速度;
- Fibonacci查找:也是一種有序查找,利用換黃金分割原理實現,實質就是調整中值;
- 線性索引查找:將索引項集合組織爲線性結構;
- 散列查找:通過散列函數直接獲取存儲位置;
下面按照上面的描述順序依次介紹各個查找的C或C++實現,以及相關優化:
順序表查找:
通過暴力循環逐項比較該項與關鍵字,時間複雜度o(n);
順序查找的實現如下:
/*這個循環中每次循環都要判斷i是否越界,針對這個情況可以提出優化*/
int search::sequentialSearch(int* a, int n, int key)
{
int i;
for (size_t i = 0; i < n; i++)
{
if (a[i]==key)
{
return i;
}
}
return -1;
}
上面的算法其實不夠完美,在for循環中每次都是需要比較i和n的值;下面提出改進版:
int search::sequentialSearch2(int* a, int n, int key)
{
if (a[0]==key)
{
return 0;
}
a[0] = key;
int i = n - 1;
while (a[i]!=key)
{
i--;
}
return i == 0 ? -1 : i;
}
在上面這個版本中減少了i和n的比較次數;