考研路_資料結構_查詢1_順序查詢和二分查詢
阿新 • • 發佈:2019-02-19
資料結構常用查詢演算法_順序查詢
順序查詢:在一個已知無(或有序)序佇列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與佇列中的數從第一個開始逐個比較,直到找出與給定關鍵字相同的數為止。
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)。