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

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

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

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

#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]; // 定義一個(gè)數(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、二分查找法

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

    假設(shè)元素序列是按升序排列,將序列中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將序列分成前、后兩個(gè)子序列,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子序列,否則進(jìn)一步查找后一子序列。重復(fù)以上過程,直到找到滿足條件的記錄,查找成功,返回元素在序列中的索引,或直到子序列不存在為止,此時(shí)查找失敗,返回-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)建一顆二分查找樹,我們知道二分查找樹的特點(diǎn)是左子樹的值都比根節(jié)點(diǎn)小,右子樹的值都比根節(jié)點(diǎn)大,且二分查找樹的中序遍歷所得到的元素是排好序的。

//二叉查找樹數(shù)據(jù)結(jié)構(gòu) 
typedef struct Btree 
{ 
  int data; 
  Btree *left; 
  Btree *right; 
}*PBTree; 
 
//創(chuàng)建二叉查找樹,返回樹的根節(jié)點(diǎn) 
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; 
} 
 
//利用二叉查找樹進(jìn)行遞歸查找 
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、總結(jié)

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

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

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

相關(guān)文章

  • 詳解C++ 前置聲明

    詳解C++ 前置聲明

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的HTTP服務(wù)器的相關(guān)資料,感興趣的朋友可以參考下
    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中使用雙緩沖避免閃爍的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 帶你深度走入C語言取整以及4種函數(shù)

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

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

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

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

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

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

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

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

    C++進(jìn)化后的const變量實(shí)例探究

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

最新評論

四子王旗| 延安市| 凤凰县| 屯留县| 桦甸市| 彭泽县| 彰化市| 原平市| 庆云县| 靖西县| 英山县| 波密县| 喀什市| 通化县| 中超| 沙田区| 靖安县| 湘潭县| 和林格尔县| 达州市| 焉耆| 田阳县| 浮山县| 若羌县| 大丰市| 岫岩| 通海县| 博野县| 南投市| 隆德县| 章丘市| 济南市| 治县。| 弥勒县| 玉山县| 鄂托克前旗| 西乌珠穆沁旗| 西充县| 始兴县| 苍南县| 岑溪市|