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

C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找

 更新時間:2014年09月18日 09:24:14   投稿:shichen2014  
這篇文章主要介紹了C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下

本文實例講述了C++實現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,分享給大家供大家參考。具體方法如下:

題目要求:

旋轉(zhuǎn)數(shù)組,如{3, 4, 5, 1, 2}是{1, 2, 3, 4, 5}的一個旋轉(zhuǎn),要求利用二分查找查找里面的數(shù)。

這是一道很有意思的題目,容易考慮不周全。這里給出如下解決方法:

#include <iostream>

using namespace std;

int sequentialSearch(int *array, int size, int destValue)
{
 int pos = -1;
 if (array == NULL || size <= 0)
 return pos;

 for (int i = 0; i < size; i++)
 {
 if (array[i] == destValue)
 {
  pos = i;
  break;
 }
 }

 return pos;
}

int normalBinarySearch(int *array, int leftPos, int rightPos, int destValue)
{
 int destPos = -1;
 if (array == NULL || leftPos < 0 || rightPos < 0)
 {
 return destPos;
 }

 int left = leftPos;
 int right = rightPos;

 while (left <= right)
 {
 int mid = (right - left) / 2 + left;

 if (array[mid] == destValue)
 {
  destPos = mid;
  break;
 }
 else
  if (array[mid] < destValue)
  {
  left = mid + 1;
  }
  else
  {
  right = mid - 1;
  }
 }

 return destPos;
}

int rotateBinarySearch(int *array, int size, int destValue)
{
 int destPos = -1;
 if (array == NULL || size <= 0)
 {
 return destPos;
 }

 int leftPos = 0;
 int rightPos = size - 1;

 while (leftPos <= rightPos)
 {
 if (array[leftPos] < array[rightPos])
 {
  destPos = normalBinarySearch(array, leftPos, rightPos, destValue);
  break;
 }
 
 int midPos = (rightPos - leftPos) / 2 + leftPos;
 if (array[leftPos] == array[midPos] && array[midPos] == array[rightPos])
 {
  destPos = sequentialSearch(array, size, destValue);
  break;
 }
 if (array[midPos] == destValue)
 {
  destPos = midPos;
  break;
 }

 if (array[midPos] >= array[leftPos])
 {
  if (destValue >= array[leftPos])
  {
  destPos = normalBinarySearch(array, leftPos, midPos - 1, destValue);
  break;
  } 
  else
  {
  leftPos = midPos + 1;
  }
 }
 else
 {
  if (array[midPos] <= array[rightPos])
  {
  destPos = normalBinarySearch(array, midPos + 1, rightPos, destValue);
  break;
  } 
  else
  {
  rightPos = midPos - 1;
  }
 }
 }

 return destPos;
}

int main()
{
 //int array[] = {3, 4, 5, 1, 2};
 //int array[] = {1, 2, 3, 4, 5};
 //int array[] = {1, 0, 1, 1, 1};
 //int array[] = {1, 1, 1, 0, 1};
 //int array[] = {1};
 //int array[] = {1, 2};
 int array[] = {2, 1};
 const int size = sizeof array / sizeof *array;

 for (int i = 0; i <= size; i++)
 {
 int pos = rotateBinarySearch(array, size, array[i]);
 cout << "find " << array[i] << " at: " << pos + 1 << endl;
 }

 for (int i = size; i >= 0; i--)
 {
 int pos = rotateBinarySearch(array, size, array[i]);
 cout << "find " << array[i] << " at: " << pos + 1 << endl;
 }
}

希望本文所述對大家C++算法設(shè)計的學習有所幫助。

相關(guān)文章

  • C++?const與constexpr區(qū)別小結(jié)

    C++?const與constexpr區(qū)別小結(jié)

    C++11標準中,const用于為修飾的變量添加只讀屬性,而constexpr關(guān)鍵字則用于指明其后是一個常量,本文主要介紹了C++?const與constexpr區(qū)別小結(jié),感興趣的可以了解一下
    2024-03-03
  • C++調(diào)用Python基礎(chǔ)功能實例詳解

    C++調(diào)用Python基礎(chǔ)功能實例詳解

    c++調(diào)用Python首先安裝Python,本文以win7為例,給大家詳細介紹C++調(diào)用Python基礎(chǔ)功能,需要的朋友參考下吧
    2017-04-04
  • 淺析C++11中的右值引用、轉(zhuǎn)移語義和完美轉(zhuǎn)發(fā)

    淺析C++11中的右值引用、轉(zhuǎn)移語義和完美轉(zhuǎn)發(fā)

    對于c++11來說移動語義是一個重要的概念,一直以來我對這個概念都似懂非懂。最近翻翻資料感覺突然開竅,因此順便記錄下C++11中的右值引用、轉(zhuǎn)移語義和完美轉(zhuǎn)發(fā),方便大家查閱參考。
    2016-08-08
  • 將字符串str1復(fù)制為字符串str2的三種解決方法

    將字符串str1復(fù)制為字符串str2的三種解決方法

    以下是對將字符串str1復(fù)制為字符串str2的三種解決方法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++二維數(shù)組中的查找算法示例

    C++二維數(shù)組中的查找算法示例

    這篇文章主要介紹了C++二維數(shù)組中的查找算法,結(jié)合實例形式分析了C++二維數(shù)組進行查找的原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C/C++中的回調(diào)用法詳細講解

    C/C++中的回調(diào)用法詳細講解

    這篇文章主要介紹了回調(diào)函數(shù)在C/C++中的重要意義及應(yīng)用,回調(diào)函數(shù)通過將函數(shù)作為參數(shù)傳遞,實現(xiàn)了模塊的解耦、靈活性和可擴展性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • 深入解讀C++中的右值引用

    深入解讀C++中的右值引用

    這里來帶大家深入解讀C++中的右值引用,右值引用是C++新標準中的重要特性,包括C++11中的引用折疊,首先還是先來看一下右值引用的概念:
    2016-05-05
  • 淺談QT打包的兩種方式

    淺談QT打包的兩種方式

    本文主要介紹了淺談QT打包的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C++begin和end運算符的返回迭代器的類型如何判斷?

    C++begin和end運算符的返回迭代器的類型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C/C++程序編譯流程詳解

    C/C++程序編譯流程詳解

    C/C++程序編譯過程包括下面4個階段:1.預(yù)處理,2.編譯,3.匯編,4.鏈接。下面我們就來詳細分析下這幾個階段。
    2016-04-04

最新評論

武胜县| 朝阳区| 信宜市| 茂名市| 常山县| 江西省| 孝感市| 舟山市| 铁岭县| 灌阳县| 安溪县| 来凤县| 永寿县| 舞阳县| 安塞县| 涞水县| 鸡泽县| 称多县| 武胜县| 陈巴尔虎旗| 江华| 南川市| 阿克陶县| 新巴尔虎左旗| 阿拉善右旗| 城固县| 崇州市| 富宁县| 河津市| 会理县| 汶川县| 调兵山市| 视频| 靖边县| 阳东县| 赤峰市| 珲春市| 海伦市| 弥渡县| 法库县| 崇信县|