C 二分查詢(迭代與遞迴)的實現

2021-09-02 22:49:35 字數 2264 閱讀 7597

程式設計過程中,查詢(或搜尋)是一種最為頻繁的操作。查詢(searching)就是根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素(或記錄)。查詢表(search table)是由同一型別的資料元素(或記錄)構成的集合。關鍵字(key)是資料元素中某個資料項的值,又叫作鍵值,可以標識乙個資料元素。若此關鍵字可唯一標識乙個記錄稱為主關鍵字(primary key);若此關鍵字可標識多個記錄稱為次關鍵字(second key)。

查詢表按操作方式來分大抵可分為:靜態查詢表和動態查詢表。

靜態查詢表

查詢某個特定的資料元素是否在表中;

檢索某個特定的資料元素及其屬性。

動態查詢表

查詢時插入資料元素;

查詢時刪除資料元素。

二分查詢只能用在插入、刪除操作不頻繁的靜態資料中,動態資料就用二叉樹了;

如果資料量太小,直接順序遍歷即可,但是如果資料之間的比較操作比較複雜,那麼減少比較操作會大大提高效能。二分查詢比順序查詢(o(n))要減少了很多次數。

資料量太大不適合二分查詢。二分查詢依賴於陣列,陣列儲存要求儲存空間位址連續,資料量大就難以保證了。

二分查詢之迭代法

該子函式要注意的一點是,要保證mid計算不能溢位。

//(1)二分查詢(有序無重複陣列)

//迭代

int binarysearch(int *arr, int low,int high, int key)

else if (arr[mid] < key)

else

return mid;

} return -1;

}

二分查詢之遞迴法

//(1)二分查詢(有序無重複陣列)

//遞迴

int binarysearchrecur(int *arr, int low, int high, int key)

else if (arr[mid] < key)

else

return mid;

} return -1;

}

二分查詢變形問題

(a)查詢第乙個等於給定值的元素

//(2)二分查詢變形問題(有序陣列)

//查詢第乙個等於給定值的元素

int binarysearchfirst(int *arr,int low,int high, int key)

else if (arr[mid] < key)

else if ((key != arr[mid - 1]) || (low == mid))

else

high = mid - 1;

} return -1;

}

(b)查詢最後乙個等於給定值的元素

//查詢最後乙個等於給定值的元素

int binarysearchlast(int *arr, int low, int high, int key)

else if (arr[mid] < key)

else if ((key != arr[mid + 1]) || (mid = high))

else

low = mid + 1;

} return -1;

}

( c) 查詢第乙個大於等於給定值的元素

//查詢第乙個大於等於給定值的元素

int binarysearchfirstbig(int *arr, int low, int high, int key)

else

low = mid + 1;

} return -1;

}

(d) 查詢最後乙個小於等於給定值的元素

//查詢最後乙個小於等於給定值的元素

int binarysearchlastsmall(int *arr, int low, int high, int key)

else

low = mid + 1;

} else

high = mid - 1;

} return -1;

}

好了,這塊的內容基本就是這些了。

若有疏漏和不足,敬請指正!謝謝!

python實現二分查詢(遞迴 迭代)

將資料分成兩部分,並比較中間值與待查詢資料大小,如果小於則在前半段查詢,如果大於則在後半段查詢。經過數次分割直到中間值等於待查資料或找不到待查資料為止。時間複雜度 o logn 資料必須是有序的,並且所有資料必須載入到記憶體中。適用於不需增刪的靜態資料。注 於吳燦銘 資料結構 使用python im...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

二分查詢(遞迴實現)

include include intk int binarysearch int a,int x,int low,int high a表示需要二分的有序陣列 公升序 x表示需要查詢的數字,low,high表示高低位 int mid low high 2 if x a mid 找到x else if...