欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年12月02日 11:51:22   作者:dazhong159  
這篇文章主要介紹了C語言編程中實(shí)現(xiàn)二分查找的簡(jiǎ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)格的限制條件(序列必須是有序的);

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

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

相關(guān)文章

  • 詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用

    詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用

    這篇文章主要介紹了詳解C語言中symlink()函數(shù)和readlink()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐

    Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐

    Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫,本文就介紹了Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中Pimpl的慣用法詳解

    C++中Pimpl的慣用法詳解

    Pimpl(Pointer?to?Implementation)是一種常見的?C++?設(shè)計(jì)模式,用于隱藏類的實(shí)現(xiàn)細(xì)節(jié),本文將通過一個(gè)較為復(fù)雜的例子,展示如何使用智能指針來實(shí)現(xiàn)?Pimpl?慣用法,需要的可以參考下
    2023-09-09
  • C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)

    C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Windows的鉤子機(jī)制詳解

    Windows的鉤子機(jī)制詳解

    這篇文章主要介紹了Windows的鉤子機(jī)制,對(duì)于初學(xué)者進(jìn)一步了解windows程序設(shè)計(jì)中鉤子的原理及運(yùn)用有很大的幫助,需要的朋友可以參考下
    2014-07-07
  • C++智能指針之shared_ptr的具體使用

    C++智能指針之shared_ptr的具體使用

    本文主要介紹了C++智能指針之shared_ptr的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-05-05
  • C++中的幾個(gè)特殊符號(hào)說明

    C++中的幾個(gè)特殊符號(hào)說明

    這篇文章主要介紹了C++中的幾個(gè)特殊符號(hào)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 淺談const變量賦值報(bào)錯(cuò)分析

    淺談const變量賦值報(bào)錯(cuò)分析

    在類中 只有靜態(tài)變量能賦值 如果你不賦值 編譯器會(huì)認(rèn)為你這個(gè)變量根本沒用 不能被修改 又沒有初始值 兩個(gè)辦法 在構(gòu)造函數(shù)的初始化列表賦值 或者在const前面加一個(gè)static
    2015-07-07
  • C語言中的奇技淫巧

    C語言中的奇技淫巧

    學(xué)習(xí)C語言的過程中,總會(huì)遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡(jiǎn)單幾行的遞歸就實(shí)現(xiàn)的功能。下面我就總結(jié)幾個(gè)C語言中 比較新手向的代碼。讓你有一種woc!還能這么寫的想法
    2018-08-08
  • C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法

    C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論