今天給朋友們帶來二分查找算法非遞歸實現和遞歸實現,剛開始卡了許久,沒有第一時間看出問題,現在把問題梳理一下,并給出解決方案,現在就給各位簡單分析遞歸與非遞歸實現代碼。
?
int binSearch(int arr[], int low, int high, int key);
int binSearch2(int arr[], int low, int high, int key);
int binSearch3(int arr[],int start,int ends,int key);
int main() {
??? int arr[]={3,8,11,15,17,22,23,26,28,29,34};
??? //printf("%d",binSearch(arr,0,10,26));
??? printf("%d",binSearch3(arr,0,10,26));
??? return 1;
}
int binSearch(int arr[], int low, int high, int key) {
??? int flag=-1;
??? int mid = (low + high) / 2;
??? if (low > high) {
??????? flag= -1;
??? } else {
??????? if (arr[mid] ??????????? flag= binSearch(arr, mid + 1, high, key);
??????? } else if (arr[mid]>key) {
??????????? //比如要找的節點在下面這一層?? 那么這一層會返回下標上來 用flag接住嘛...
??????????? flag= binSearch(arr,low,mid-1,key);//又差一點忘記了用flag取接住返回值了
??????? } else {
??????????? flag= mid;
??????? }
??? }
??? return flag;
}
//ok==============================
int binSearch2(int arr[], int low, int high, int key) {
??? int mid = (low + high) / 2;
??? if (low > high) {
??????? return -1;
??? } else {
??????? if (arr[mid] ??????????? return binSearch2(arr, mid + 1, high, key);
??????? } else if (arr[mid]>key) {
??????????? return binSearch2(arr,low,mid-1,key);
??????? } else {
??????????? return mid;
??????? }
??? }
}
int binSearch3(int arr[],int start,int ends,int key){
??? int mid=-1;
??? while(start??????? mid=(start+ends)/2;
??????? if(arr[mid]
??????? }else if(arr[mid]>key){
??????????? ends=mid-1;
??????? }else{
??????????? break;
??????? }
??? }//上述循環結束后不一定就是 start>ends的? 因為有break語句
??? if(start>ends){
??????? mid=-1;
??? }
??? return mid;
}???????
以上就是簡單分析遞歸與非遞歸實現代碼,想必都已有了一定的了解,更多關于C語言的內容請繼續關注武林技術頻道。
新聞熱點
疑難解答
圖片精選