考研路_數據結構_查找1_順序查找和二分查找


數據結構常用查找算法_順序查找

順序查找:在一個已知無(或有序)序隊列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與隊列中的數從第一個開始逐個比較,直到找出與給定關鍵字相同的數為止。

C語言實現:

int Linear_Search1(int *a, int n, int key) 
{
//從序列表中查找為key的關鍵值,成功則返回其下標值,否則查找失敗,返回-1
int i;
for(i==1; i<=n; i++)
{
if(a[i] == key)
{
return i;
}
}
return 0;
}


上述順序查找代碼中,並未最優化的,因為每次循環時都需要對i,進行越界判斷(;i<=n;),為避免重復判斷,可用哨兵法。代碼如下:

int Linear_Search2(int *a, int n, int key) 
{
int i;
a[0] = key; /*將關鍵值key賦值給a[0],即設置“哨兵”*/
i = n;
while(a[i] != key)
{
i--;
}
return i; /*返回0則說明未找到關鍵值key*/
}

Linear_Search2代碼詳解:

該段代碼從尾部n開始查找,將a[0]賦值為key,若在查找過程中,成功找到key值,則返回其下標i,若無法找到,則i的值等於0。

“哨兵”法:在查找前設置哨兵,可避免查找過程的每次的溢出判斷,在總數據較多時有效的改善了Linear_Search1的方法。

java語言實現:

public class LinearSearch {
public int getIndex(int[] arr, int key) {
int i;
for(i=0; i<arr.length; i++) {
if(arr[i] == key)
return i;
}
return -1;
}
}

這是個迭代過程,從數組下標為0到數組下標最大值,若找到給定關鍵值,則返回該值在數組中的位置,否則查找失敗,時間復雜度為O(n)。

數據結構常用查找算法_二分查找

二分查找又稱折半查找:每次選取剩下一半的中間進行查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。

C語言實現:

int Binary_Search(int *a, int n, int key) 
{
int low = 0; /*設置下區間*/
int high = n; /*設置上區間*/
if(a[low] == key) /*判斷是否為上下端點*/
return low;
if(a[high] == key)
return high;
while(low <= high)
{
int mid = low + (high - low)/2; /*避免((low+high)/2)中(low+high)的結果溢出,即值大於數據類型所能表達的最大值*/
if(a[mid] == key) /*查找到關鍵值並返回其下標值*/
return mid;
else if(a[mid] < key)
low = mid + 1; /*中間值比關鍵值小,則把中間值加1賦值給下一輪的下區間*/
else
high = mid - 1; /*中間值比關鍵值大,則把中間值減1賦值給下一輪的上區間*/
}
}

java語言實現:

public class BinarySearch {
public int getIndex(int[] arr, int key) {
int low = 0; //下區間
int high = arr.length-1;//上區間
while(low <= high) {
int mid = (low + high)/2;
if(arr[mid] == key) {
return mid; //查找成功,返回關鍵值在數組中的位置
}else if(arr[mid] < key) {
low = mid + 1; //中間值比關鍵值小,則把中間值加1賦值給下一輪的下區間
}else {
high = mid - 1; //中間值比關鍵值大,則把中間值減1賦值給下一輪的上區間
}
}
return -1; //查找失敗
}
}

二分查找過程,時間復雜度為O(logn)。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com