可能實現函數實現二分查找,咱們首先想到的是接下來這種代碼:
數組
//二分查找 #include <stdio.h> #include <string.h> int cz_sz(int num[],int a) { int left,right,mid; left=0; right=sizeof(num)/sizeof(num[0])-1; mid=(left+right)/2; while(left<=right) { if(num[mid]>a) { right=mid+1; } else if(num[mid]<a) { left=mid+1; } else return mid; } if(left>right) return 0; } int main() { int left,right,mid; int a,t; int num[]={1,2,3,4,5,6,7,8,9,10}; printf ("請輸入你要查找的值:"); scanf ("%d",&a); t=cz_sz(num,a); if(0==t) { printf ("沒有找到\n"); } else { printf ("找到了,下標爲:%d\n",t); } return 0; }
而後你會尷尬的發現:
當你輸入了數組當中有的數字以後,他竟然給我返回一個..........話很少說上圖:
ide
????這是怎麼回事呢函數
原來啊,數組在傳參的時候僅僅只是傳參了首地址過去。、,因此纔會致使計算長度的時候出現錯誤。
咱們的解決辦法是,把計算數組長度放在主函數裏面,在主調函數中多增長一個參數,來解決問題。
朋友們咱們必定要記住:形參其實只是實參的一份臨時拷貝,對形參的改變不會改變實參值,只有經過傳址調用創建聯繫才能對值進行更改(簡而言之:使用指針!!!!)指針
咱們將函數改成以下便可:
blog
//二分查找 #include <stdio.h> #include <string.h> int cz_sz(int num[], int a, int b) { int left, right, mid; left = 0; right = b - 1; while (left <= right) { mid = (left + right) / 2; if (num[mid] > a) { right = mid + 1; } else if (num[mid] < a) { left = mid + 1; } else return mid; } return 0; } int main() { int a, t; int num[] = { 1,2,3,4,5,6,7,8,9,10 }; int b = sizeof(num) / sizeof(num[0]); printf("請輸入你要查找的值:"); scanf_s("%d", &a); t = cz_sz(num,a,b); if (0 == t) { printf("沒有找到\n"); } else { printf("找到了,下標爲:%d\n", t); } }
如今執行就沒有什麼問題了,但願讀者可以技術分享,有什麼問題指出來,哈哈。而後,scanf_s函數是我在VS2019中程序的規範要求!!!!!string