C 二分尋找 遞迴與非遞迴的實現代碼

來源:互聯網
上載者:User

複製代碼 代碼如下:#include <stdio.h>

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] < key) {
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] < key) {
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<=ends){
mid=(start+ends)/2;
if(arr[mid]<key){
start=mid+1;
}else if(arr[mid]>key){
ends=mid-1;
}else{
break;
}
}//上述迴圈結束後不一定就是 start>ends的 因為有break語句
if(start>ends){
mid=-1;
}
return mid;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.