日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言折半查找法的超詳細講解_C 語言

作者:一個愛好編程的大學生i ? 更新時間: 2022-08-10 編程語言

折半查找法僅適用于對已有順序的數組、數據進行操作!!!(從小到大)自我總結:折半查找法就是相當于(通過改變low或high的大小)把中間位置指到了key那個數那里,所以mid應該處于循環里面,即mid=(high+low)/2。注意:low,mid,high都要與下標綁定,也就是說它們就是下標。且循環條件是:high>=low.

同時注意:⑴若原來數組是由小到大排列的則:

? ? ? mid=(high+low)/2;
? ? ? ? ? ? if(key<a[mid])//說明要找的值在左邊
? ? ? ? ? ? high=mid-1;
? ? ? ? ? ? else if(key>a[mid])//說明要找的值在mid右邊
? ? ? ? ? ? low=mid+1;//最小值的位置往右進一位

㈡若原來數組是由大到小排列的則:

mid=(high+low)/2;
? ? ? ? ? ? if(key>a[mid])//注意是由大到小排列 ,所以此時key在a【mid】 左邊,故high=mid-1 ;
? ? ? ? ? ? high=mid-1;
? ? ? ? ? ? else if(key<a[mid])//注意是由大到小排列,所以此時key在a【mid】右邊,故low=mid+1;
? ? ? ? ? ? low=mid+1;

當然在下面這個代碼中,也可以用選擇排序法和冒泡法來對任意數組進行排序,然后在應用此函數,保證折半查找法的前提是排好序了。

#include<stdio.h>
 void zb(int key,int a[],int n)//key表示要找的數,a表示數組,n表示數組元素個數 
 {
     int i,high,low,mid;
     int count1=0,count=0;
     low=0;
     high=n-1;
     while(high>=low)//保證右下標不小于左下標 
     {    
        count++;
        mid=(high+low)/2;//總的來說變得是中間位置相當于把中間位置移到了key那個數那里,所以mid應該處于循環里面 
         if(key<a[mid])//說明key在a【mid】的左半邊 ,那么最右邊的high下標就可以在下標mid基礎上往左進一個單位了
        high=mid-1;
         else if(key>a[mid])//說明key在a【mid】的右半邊 ,那么最左邊的low下標就可以在下標mid基礎上往右進一個單位了 
         low=mid+1;
        if(key==a[mid])
        {
            printf("元素找到了!!!\n一共查找了%d次\n它處于a[%d]位置上\na[%d]=%d\n",count,mid,mid,key);
            count1++;
            break;
        }
    }
     if(count1==0)
     printf("元素不存在!!!\n");
 }
 int main ()
 {
     int key,n,a[100];
     int i;
     void zb(int key,int a[],int n);//聲明定義函數 
     printf("請輸入數組元素個數:\n");
     scanf("%d",&n);
     printf("請輸入(從小到大)所有數組元素:\n");
     for(i=0;i<n;i++)
     {
         scanf("%d",&a[i]);
     }
     printf("請輸入要查找的數:\n");
     scanf("%d",&key);
     zb(key,a,n);
     printf("\n");
     return 0;
 }

總結

原文鏈接:https://blog.csdn.net/m0_56168966/article/details/121390236

欄目分類
最近更新