最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言編程中實現(xiàn)二分查找的簡單入門實例

 更新時間:2015年12月02日 11:51:22   作者:dazhong159  
這篇文章主要介紹了C語言編程中實現(xiàn)二分查找的簡單入門實例,需要的朋友可以參考下

架設有一個數(shù)組 v 已經(jīng)按升序排列了,數(shù)組 v 有 n=20 個元素。數(shù)組中有個元素 x,如何知道 x 位于該數(shù)組的第幾位呢?
解決這個問題的一個普遍方法就是二分查找法。下面是程序:

#include <stdio.h>
int binsearch(int x, int v[], int n);
main()
{
  int i, result, n;
 int wait;
  
  int x = 17; // 需要查找的數(shù)值
 int v[19]; // 定義一個數(shù)組
 // 給數(shù)組賦值
 for(i = 0; i < 20; ++i)
   v[i] = i;
 /**
 for(i = 0; i < 20; ++i)
 printf("%d \n", v[i]);
 */
 n = 20;
 result = binsearch(x, v, n);
 printf("%d", result);
 scanf("%d", &wait);
}
int binsearch(int x, int v[], int n)
{
 int low, high, mid;
 low = 0;
 high = n - 1;
 while (low <= high)
 {
 mid = (low + high) / 2;
 if(x < v[mid])
  high = mid - 1;
 else if (x > v[mid])
  low = mid + 1;
 else
  return mid;
 // 看看循環(huán)執(zhí)行了多少次
 printf("mid = %d, low = %d, high = %d \n", mid, low, high);
 }
 return -1;
}

1、二分查找法

    二分查找法有一個很重要的前提條件:即待查找的序列必須是已經(jīng)排好序的。

    假設元素序列是按升序排列,將序列中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將序列分成前、后兩個子序列,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子序列,否則進一步查找后一子序列。重復以上過程,直到找到滿足條件的記錄,查找成功,返回元素在序列中的索引,或直到子序列不存在為止,此時查找失敗,返回-1。

 

int find2(int *array,int n,int val) 
{ 
  if (n<=0) 
  { 
    return -1; 
  } 
 
  int begin=0,end=n-1,mid; 
  while(begin<=end)       
  { 
    mid=(begin+end)/2; 
    if (array[mid]==val) 
      return mid; 
    else if(array[mid]>val) 
      end=mid-1; 
    else 
      begin=mid+1; 
  } 
 
  return -1; 
} 

2、使用二分查找樹查找

    首先創(chuàng)建一顆二分查找樹,我們知道二分查找樹的特點是左子樹的值都比根節(jié)點小,右子樹的值都比根節(jié)點大,且二分查找樹的中序遍歷所得到的元素是排好序的。

//二叉查找樹數(shù)據(jù)結構 
typedef struct Btree 
{ 
  int data; 
  Btree *left; 
  Btree *right; 
}*PBTree; 
 
//創(chuàng)建二叉查找樹,返回樹的根節(jié)點 
PBTree CreateBTree(int *array,int n) 
{ 
  PBTree root=new Btree; 
  root->data=array[0]; 
  root->left=NULL; 
  root->right=NULL; 
 
  PBTree current,back,pNew; 
  for (int i=1;i<n;i++) 
  { 
    pNew=new Btree; 
    pNew->data=array[i]; 
    pNew->left=pNew->right=NULL; 
    current=root; 
    while(current!=NULL)  //找到合適的插入位置 
    { 
      back=current; 
      if(current->data>array[i]) 
        current=current->left; 
      else 
        current=current->right; 
    } 
    if(back->data>array[i]) 
      back->left=pNew; 
    else 
      back->right=pNew; 
  } 
 
  return root; 
} 
 
//利用二叉查找樹進行遞歸查找 
bool find3(PBTree root,int val) 
{ 
  if (root==NULL) 
    return false; 
  if (root->data==val) 
    return true; 
  else if(root->data>val) 
    return find3(root->left,val); 
  else 
    return find3(root->right,val); 
} 

3、總結

    二分查找有非常嚴格的限制條件(序列必須是有序的);

    而使用二分查找樹,則會自動創(chuàng)建出"有序樹"(中序遍歷得到的序列是有序的);

    不考慮二叉查找樹的建立時間,二者的效率一樣,均為O(logn)。

相關文章

  • 詳解C++ 前置聲明

    詳解C++ 前置聲明

    這篇文章主要介紹了C++ 前置聲明的相關資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-09-09
  • 一文搞懂C++ 動態(tài)內(nèi)存

    一文搞懂C++ 動態(tài)內(nèi)存

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存的的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C++實現(xiàn)簡單的HTTP服務器

    C++實現(xiàn)簡單的HTTP服務器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單的HTTP服務器的相關資料,感興趣的朋友可以參考下
    2016-05-05
  • 如何通過wrap malloc定位C/C++的內(nèi)存泄漏問題

    如何通過wrap malloc定位C/C++的內(nèi)存泄漏問題

    用C/C++開發(fā)的程序執(zhí)行效率很高,但卻經(jīng)常受到內(nèi)存泄漏的困擾。本文提供一種通過wrap malloc查找memory leak的思路。
    2021-05-05
  • 基于WTL中使用雙緩沖避免閃爍的解決方法

    基于WTL中使用雙緩沖避免閃爍的解決方法

    本篇文章是對WTL中使用雙緩沖避免閃爍的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 帶你深度走入C語言取整以及4種函數(shù)

    帶你深度走入C語言取整以及4種函數(shù)

    大家都知道取整這回事,但是對于取整只有單一的認識,下面這篇文章主要給大家介紹了關于C語言取整以及4種函數(shù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 淺談c++ vector和map的遍歷和刪除對象

    淺談c++ vector和map的遍歷和刪除對象

    下面小編就為大家?guī)硪黄獪\談c++ vector和map的遍歷和刪除對象。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 一文掌握C語言中的柔性數(shù)組

    一文掌握C語言中的柔性數(shù)組

    柔性數(shù)組在C語言的?C99?標準中,引入的新特性,結構中的最后一個元素的大小允許是未知的數(shù)組,即為柔性數(shù)組,本文給大家介紹c語言中的柔性數(shù)組,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • C語言實現(xiàn)高精度加法

    C語言實現(xiàn)高精度加法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)高精度加法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++進化后的const變量實例探究

    C++進化后的const變量實例探究

    這篇文章主要為大家介紹了C++進化后的const變量實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論

闽清县| 万州区| 平原县| 白银市| 新民市| 乐陵市| 化德县| 建昌县| 额敏县| 璧山县| 三亚市| 马尔康县| 公安县| 枣阳市| 曲水县| 八宿县| 昭平县| 石河子市| 天水市| 宁津县| 太仆寺旗| 卢湾区| 青浦区| 友谊县| 彰化市| 安乡县| 四会市| 班玛县| 库伦旗| 安陆市| 陆河县| 石门县| 波密县| 嘉善县| 彰化市| 晋城| 竹溪县| 杭锦后旗| 武义县| 广元市| 肥乡县|