- Get up. Keep moving.
站起來,繼續前進。
一、順序查找
/* 無哨兵順序查找,a爲數組,n爲要查找的數組個數,key爲要查找的關鍵字 */
int Sequential_Search(int *a,int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if (a[i]==key)
return i;
}
return 0;
}
/* 有哨兵順序查找,不用比較i,效率會高一點 */
int Sequential_Search2(int *a,int n,int key)
{
int i;
a[0]=key;
i=n;
while(a[i]!=key)
{
i--;
}
return i;
}
二、折半查找(二分查找)
中間值計算的基本公式如下:
C語言實現如下:
/***************************
* 功能:折半查找(二分查找)
* 時間複雜度:O(logn)
* 輸入:
* a -- 數組(數據集查找表)
* n -- 數據集大小
* key -- 要查找的元素
* 輸出:
* 查找的元素在數據集a中的位置
***************************/
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low = 0; /* 定義最低下標爲記錄首位 */
high = n-1; /* 定義最高下標爲記錄末位 */
while(low <= high)
{
mid = (low+high)/2; /* 折半 */
if (key < a[mid]) /* 若查找值比中值小 */
high = mid-1; /* 最高下標調整到中位下標小一位 */
else if (key > a[mid])/* 若查找值比中值大 */
low = mid+1; /* 最低下標調整到中位下標大一位 */
else
{
return mid; /* 若相等則說明mid即爲查找到的位置 */
}
}
return -1;
}
三、插值查找
對摺半查找優化,其計算中間值的基本公式如下:
/* 插值查找 */
/* 注:該代碼默認查找集的有效數據從位置1開始,位置0的值無效 */
int Interpolation_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; /* 定義最低下標爲記錄首位 */
high=n; /* 定義最高下標爲記錄末位 */
while(low<=high)
{
mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */
if (key<a[mid]) /* 若查找值比插值小 */
high=mid-1; /* 最高下標調整到插值下標小一位 */
else if (key>a[mid])/* 若查找值比插值大 */
low=mid+1; /* 最低下標調整到插值下標大一位 */
else
return mid; /* 若相等則說明mid即爲查找到的位置 */
}
return 0;
}
四、斐波那契查找
利用斐波那契數列實現的黃金分割率來確定中間值。
/* 斐波那契查找 */
/* 注:該代碼默認查找集的有效數據從位置1開始,位置0的值無效 */
int Fibonacci_Search(int *a,int n,int key)
{
int low,high,mid,i,k=0;
low=1; /* 定義最低下標爲記錄首位 */
high=n; /* 定義最高下標爲記錄末位 */
while(n>F[k]-1)
k++;
for (i=n;i<F[k]-1;i++)
a[i]=a[n];
while(low<=high)
{
mid=low+F[k-1]-1;
if (key<a[mid])
{
high=mid-1;
k=k-1;
}
else if (key>a[mid])
{
low=mid+1;
k=k-2;
}
else
{
if (mid<=n)
return mid; /* 若相等則說明mid即爲查找到的位置 */
else
return n;
}
}
return 0;
}