順序查找
查找最好的情況是在第一個位置找到了,算法時間複雜度爲O(1)
最壞的情況下在最後一個位置,需要n次比較,時間複雜度爲O(n)
查不到,需要比較n+1次,時間複雜度爲O(n+1)
關鍵字在任何一個位置上是相同的,所以平均查找次數爲(n+1)/2
最終時間複雜度爲O(n)
//n 數組長度,key 查找關鍵字,a爲數組
int Sequential_Search(int key,int n,int *a)
{
int i;
for(i = 1;i<=n;i++)
{
if(a[i] == key)
return i;
}
return 0;
}
改進的算法,設置哨兵,效率比第一個高
int Seqential_Search_new(int key,int n,int *a)
{
int i;
a[0] = key;/*設置哨兵,避免每次比較後都要判斷查找位置是否越界*/
i = n;/*循環從尾部開始*/
while(a[i] != key)
{
i--;
}
return i;/*返回0 則查找失敗*/
}
折半查找,又稱二分查找
基本思想是在有序表中,取中間記錄最爲比較對象。若查找值與中間記錄值相等,則查找成功;
否則小於中間值,則在左半區繼續查找;大於中間值在右半區查找
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low = 1;
high = n;
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;
}
return 0;
}